Usage of Monitoring Kafka extensionΒΆ

To try out there is a docker-compose.yml file in the test/resources directory. This will start up a Kafka broker and a schema registry instance. To start it up you need docker and docker-compose installed then run:

# start kafka
cd src/community/monitor-kafka/src/test/resources
docker-compose up -d

This will start up the Kafka broker and the schema registry.

Once Kafka is running start geoserver with monitor and monitor-kafka extension from src/web/app:

mvn jetty:run -P monitor,monitor-kafka

This will initialize the data directory in src/web/app/src/main/webapp/data and start up geoserver. Stop the geoserver again.

With this you will get the default monitor config installed automatically in src/web/app/src/main/webapp/data/monitoring/. Edit it to use the Kafka storage.

Then you need to configure the monitor-kafka extension for it with:

storage=kafka
kafka.bootstrap.servers=localhost:9092
kafka.schema.registry.url=http://localhost:8081

Create your topic with:

docker exec -ti broker kafka-topics --bootstrap-server localhost:9092 --create --topic geoserver-monitor --partitions 1 --replication-factor 1 --if-not-exists

Start geoserver again with:

mvn jetty:run -P monitor,monitor-kafka

Check that the monitoring extension is actually enabled by looking for the following log line:

INFO   [geoserver.monitor] - Kafka connection established and topic geoserver-monitor exists

Head over to http://localhost:8080/geoserver and hit some map, so you get some data into the topic.

If you want to consume the data you need a consumer which has the right Deserializer configured (io.confluent.kafka.serializers.KafkaAvroDeserializer).

The easiest way to do this is to enter the schema registry container with:

 docker exec -ti schema-registry bash
 # from within the container run:
   kafka-avro-console-consumer \
     --bootstrap-server broker:29092 \
     --topic geoserver-monitor \
     --from-beginning

# or directly from the host machine so you can pipe it into jq or a file...
 docker exec -ti schema-registry kafka-avro-console-consumer \
     --bootstrap-server broker:29092 \
     --topic geoserver-monitor \
     --from-beginning | tee >(grep -E "^{" | jq) | grep -vE "^{"

Then you will see messages like this:

{
    "id": 2,
    "status": "FINISHED",
    "category": "OWS",
    "path": "/tiger/wms",
    "queryString": "SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&STYLES&LAYERS=tiger:giant_polygon&exceptions=application/vnd.ogc.se_inimage&SRS=EPSG:4326&WIDTH=768&HEIGHT=384&BBOX=3.7958354296875,-40.4131489453125,71.2627583203125,-6.6962260546875",
    "body": "",
    "bodyContentLength": 0,
    "bodyContentType": "",
    "httpMethod": "GET",
    "startTime": 1697172148809,
    "endTime": 1697172148902,
    "totalTime": 93,
    "remoteAddress": "[0:0:0:0:0:0:0:1]",
    "remoteHost": "0:0:0:0:0:0:0:1",
    "host": "localhost",
    "internalHost": "client",
    "remoteUser": "anonymous",
    "remoteUserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
    "remoteCountry": "",
    "remoteCity": "",
    "remoteLat": 0.0,
    "remoteLon": 0.0,
    "service": "WMS",
    "operation": "GetMap",
    "owsVersion": "1.1.1",
    "subOperation": "",
    "resources": [
        "tiger:giant_polygon"
    ],
    "responseLength": 6594,
    "responseContentType": "image/png",
    "errorMessage": "",
    "responseStatus": 0,
    "httpReferer": "",
    "coordinateReferenceSystem": "EPSG:WGS 84",
    "minx": 3.7958354296875,
    "miny": -40.4131489453125,
    "maxx": 71.2627583203125,
    "maxy": -6.6962260546875,
    "cacheResult": "",
    "missReason": "",
    "resourceProcessingTimes": [],
    "labelingProcessingTime": 0
}
{
    "id": 3,
    "status": "FINISHED",
    "category": "OWS",
    "path": "/tiger/wms",
    "queryString": "SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureInfo&FORMAT=image/png&TRANSPARENT=true&QUERY_LAYERS=tiger:giant_polygon&STYLES&LAYERS=tiger:giant_polygon&exceptions=application/vnd.ogc.se_inimage&INFO_FORMAT=text/html&FEATURE_COUNT=50&X=50&Y=50&SRS=EPSG:4326&WIDTH=101&HEIGHT=101&BBOX=39.23891004908502,-32.22561743843973,48.11586317408502,-23.348664313439727",
    "body": "",
    "bodyContentLength": 0,
    "bodyContentType": "",
    "httpMethod": "GET",
    "startTime": 1697172178181,
    "endTime": 1697172178213,
    "totalTime": 32,
    "remoteAddress": "[0:0:0:0:0:0:0:1]",
    "remoteHost": "",
    "host": "localhost",
    "internalHost": "client",
    "remoteUser": "anonymous",
    "remoteUserAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
    "remoteCountry": "",
    "remoteCity": "",
    "remoteLat": 0.0,
    "remoteLon": 0.0,
    "service": "WMS",
    "operation": "GetFeatureInfo",
    "owsVersion": "1.1.1",
    "subOperation": "",
    "resources": [
        "giant_polygon"
    ],
    "responseLength": 803,
    "responseContentType": "text/html;charset=utf-8",
    "errorMessage": "",
    "responseStatus": 0,
    "httpReferer": "",
    "coordinateReferenceSystem": "EPSG:WGS 84",
    "minx": 43.63344129908502,
    "miny": -27.743195563439727,
    "maxx": 43.63344129908502,
    "maxy": -27.743195563439727,
    "cacheResult": "",
    "missReason": "",
    "resourceProcessingTimes": [],
    "labelingProcessingTime": 0
}