springwolf / springwolf-core

Automated documentation for event-driven applications built with Spring Boot
https://www.springwolf.dev
Apache License 2.0
234 stars 66 forks source link

Display server per channel in springwolf-ui #700

Open stammaja opened 3 months ago

stammaja commented 3 months ago

In a setup similar to your example ExampleClassLevelKafkaListener, I tried to use KafkaAsyncOperationBinding "type" in order to separate listeners per server they listen to. But I'm getting "kafka" instead.

springwolf-kafka version 1.1.0.

@KafkaListener(topics = "${push-api.topic}", groupId = "${push-api.topic.consumer-group}")
public class PushApiListener {

    @KafkaHandler
    @KafkaAsyncOperationBinding(
            type = "kafka-external"
    )
    public void handleNotification(NotificationDto notification) {
        ...
    }
springwolf.docket.servers.kafka-external.protocol=kafka-secure
springwolf.docket.servers.kafka-external.host=...

Expected: In the UI listener will be shown with tag "kafka-external" Actual: It is shown still as "kafka"


EDIT by maintainer:

Requested enhancement:

According to the spec, a server can be present on the channel kafka-example. If not present, the channel is available on all servers defined in the servers block.

You, or anybody who is interested, is welcome to contribute.

github-actions[bot] commented 3 months ago

Welcome to Springwolf. Thanks a lot for reporting your first issue. Please check out our contributors guide and feel free to join us on discord.

timonback commented 3 months ago

Hi @stammaja,

that is a great feature enhancement to show in springwolf-ui the server for each found channel (kafka topic in your case).


Using your example, you probably want to configure it, so that the server name is kafka-external:

springwolf.docket.servers.kafka-external.protocol=kafka
springwolf.docket.servers.kafka-external.host=...

Also, your listener needs to know about the server name. You can use the @AsyncOperation annotation for that:

    @KafkaHandler
    @AsyncListener(
            operation =
                    @AsyncOperation(
                            channelName = TOPIC,
                            servers = {"kafka-external"}))
    public void handleNotification(NotificationDto notification) {
        //        ...
    }

(We plan to remove the type field as it is constant for the protocol name (kafka) and should not be modified)

Now, the server name shows up correctly in the asyncapi.json file.

timonback commented 2 months ago

To better indicate in the ui the difference between protocol and server name, https://github.com/springwolf/springwolf-core/pull/738 updates the examples

Help is still welcome to show the server name as part of the channel item

timonback commented 1 week ago

On this is being worked in https://github.com/springwolf/springwolf-core/pull/832