GithubHelp home page GithubHelp logo

zalando-incubator / remora Goto Github PK

View Code? Open in Web Editor NEW
196.0 17.0 31.0 161 KB

Kafka consumer lag-checking application for monitoring, written in Scala and Akka HTTP; a wrap around the Kafka consumer group command. Integrations with Cloudwatch and Datadog. Authentication recently added

License: MIT License

Scala 95.82% Python 4.18%
kafka akka-http monitoring scala zalando remora consumer-lag-checking cloudwatch zalando-dublin lag

remora's Introduction

Remora

Grafana Graph

Remora is a monitoring utility for Apache Kafka that provides consumer lag checking as a service. An HTTP endpoint is provided to request consumer group information on demand. Combining this with a time series database like KairosDB it is possible to graph your consumer group status; see remora fetcher for an example of this.

Remora is stable and production ready. A number of production kafka clusters in Zalando are being monitored by Remora right now!

Inspiration

We created Remora after spending some time using Linkedin's burrow application for monitoring consumer lag and experiencing some performance problems (burrow shut down after an unknown amount with no error stack, alert or sign of error. We have no idea why but we had to keep restarting the app which was very annoying). Remora provides the Kafka consumer group command as an HTTP endpoint.

User Testimonials

We are using Kafka 0.10.2.1 extensively. As almost all our applications depend on Kafka, we needed a way to visualise consumer data over a time period in order to discover issues with our consumers. Remora lets us do exactly this, it exposes consumer group metrics over HTTP which allow us to create alarms if a consumer has stopped or slowed consumption from a topic or even on a single partition. ~ Team Buffalo @ Zalando Dublin

We are using Kafka 0.10.2.1 along with Akka Streams. We use Remora to track, alert, and visualise any lag within any of our components ~ Team Setanta @ Zalando Dublin

We rely on Kafka for streaming DB change events on to other teams within our organisation. Remora greatly aids us in ensuring our Kafka and Kafka Connect components are functioning correctly by monitoring both the number of events been produced, and any lag present on a per consumer basis. It is proving an excellent tool in providing data which we use to trigger real time alerts ~ Team Warhol @ Zalando Dublin

We use Kafka and Kafka Streaming to orchestrate the different components of our text processing pipeline. Through data provided by Remora, we monitor lags in different topics as part of our monitoring dashboard and alerting system. Remora makes it easier for us to quickly identify and respond to bottlenecks and problems. ~ Team Sapphire @ Zalando Dublin

We are using Mirror Maker to replicate data between two Kafka brokers and Remora has been a great help to monitor the replication in real time. The metrics exposed by Remora are pushed to Datadog, on top of which we build dashboards and triggers to help us react in case of failure. ~ Sqooba Switzerland

Getting started

Dependencies

The latest release of Remora supports Apache Kafka 3.1.0 and earlier.

To find the latest releases, please see the following examples:

$ curl https://registry.opensource.zalan.do/teams/buffalo/artifacts/remora/tags | jq ".[] | .name"

$ pierone latest buffalo remora --url registry.opensource.zalan.do # requires `$ pip3 install stups-pierone`

Running it

Images for all versions are available on Zalando opensource pierone

They can be used as follows:

docker run -it --rm -p 9000:9000 -e KAFKA_ENDPOINT=127.0.0.1:9092 registry.opensource.zalan.do/buffalo/remora

Run it with different log level:

docker run -it --rm -p 9000:9000 -e KAFKA_ENDPOINT=127.0.0.1:9092 -e 'JAVA_OPTS=-Dlogback-root-level=INFO' registry.opensource.zalan.do/buffalo/remora

For further examples see the docker-compose.yml

docker-compose -f basic-example/docker-compose.yml up

Run remora in IDE with kafka and zookeeper run by docker-compose. Note you must set -e KAFKA_ENDPOINT="kafka:9094" and --network basic-example_default for Remora to work with Kafka from docker-compose.

docker-compose -f basic-example/docker-compose.yml up --scale remora=0

Remora is stateless, so test the scale of the API

docker-compose -f basic-example/docker-compose.yml up --scale remora=3

For examples with broker authentication see the docker-compose.yml

docker-compose -f auth-example/docker-compose.yml up

Usage

Show active consumers

$ curl http://localhost:9000/consumers
["consumer-1", "consumer-2", "consumer-3"]

Show specific consumer group information

$ curl http://localhost:9000/consumers/<ConsumerGroupId>
{  
   "state":"Empty",
   "partition_assignment":[  
      {  
         "group":"console-consumer-20891",
         "coordinator":{  
            "id":0,
            "id_string":"0",
            "host":"foo.company.com",
            "port":9092
         },
         "topic":"products-in",
         "partition":1,
         "offset":3,
         "lag":0,
         "consumer_id":"-",
         "host":"-",
         "client_id":"-",
         "log_end_offset":3
      },
      {  
         "group":"console-consumer-20891",
         "coordinator":{  
            "id":0,
            "id_string":"0",
            "host":"foo.company.com",
            "port":9092
         },
         "topic":"products-in",
         "partition":0,
         "offset":3,
         "lag":0,
         "consumer_id":"consumer-1-7baba9b9-0ec3-4241-9433-f36255dd4708",
         "host":"/xx.xxx.xxx.xxx",
         "client_id":"consumer-1",
         "log_end_offset":3
      }
   ],
   "lag_per_topic":{
        "products-in" : 0
   }
}

Health

$ curl http://localhost:9000/health
{
    "cluster_id": "foobar_123",
    "controller": {
        "host": "xx.xxx.xxx.xxx",
        "id": 0,
        "id_string": "0",
        "port": 9092
    },
    "nodes": [
        {
            "host": "xx.xxx.xxx.xxx",
            "id": 0,
            "id_string": "0",
            "port": 9092
        }
    ]
}

Metrics

$ curl http://localhost:9000/metrics
{
  "version": "3.0.0",
  "gauges": {
    "PS-MarkSweep.count": {
      "value": 7371
    },
    "PS-MarkSweep.time": {
      "value": 310404
    },
    "PS-Scavenge.count": {
      "value": 476530
    },
    "PS-Scavenge.time": {
      "value": 1234370
    },
    "blocked.count": {
      "value": 0
    },
    "count": {
      "value": 12
    },
    "daemon.count": {
      "value": 3
    },
    "deadlock.count": {
      "value": 0
    },
    "deadlocks": {
      "value": []
    },
    "heap.committed": {
      "value": 74448896
    },
    "heap.init": {
      "value": 132120576
    },
    "heap.max": {
      "value": 1860698112
    },
    "heap.usage": {
      "value": 0.021295551247380425
    },
    "heap.used": {
      "value": 39624592
    },
    "new.count": {
      "value": 0
    },
    "non-heap.committed": {
      "value": 73883648
    },
    "non-heap.init": {
      "value": 2555904
    },
    "non-heap.max": {
      "value": -1
    },
    "non-heap.usage": {
      "value": -72377144
    },
    "non-heap.used": {
      "value": 72377144
    },
    "pools.Code-Cache.committed": {
      "value": 27525120
    },
    "pools.Code-Cache.init": {
      "value": 2555904
    },
    "pools.Code-Cache.max": {
      "value": 251658240
    },
    "pools.Code-Cache.usage": {
      "value": 0.10638478597005209
    },
    "pools.Code-Cache.used": {
      "value": 26772608
    },
    "pools.Compressed-Class-Space.committed": {
      "value": 5242880
    },
    "pools.Compressed-Class-Space.init": {
      "value": 0
    },
    "pools.Compressed-Class-Space.max": {
      "value": 1073741824
    },
    "pools.Compressed-Class-Space.usage": {
      "value": 0.004756048321723938
    },
    "pools.Compressed-Class-Space.used": {
      "value": 5106768
    },
    "pools.Metaspace.committed": {
      "value": 41115648
    },
    "pools.Metaspace.init": {
      "value": 0
    },
    "pools.Metaspace.max": {
      "value": -1
    },
    "pools.Metaspace.usage": {
      "value": 0.984972144911835
    },
    "pools.Metaspace.used": {
      "value": 40497768
    },
    "pools.PS-Eden-Space.committed": {
      "value": 40894464
    },
    "pools.PS-Eden-Space.init": {
      "value": 33554432
    },
    "pools.PS-Eden-Space.max": {
      "value": 693108736
    },
    "pools.PS-Eden-Space.usage": {
      "value": 0.02002515230164405
    },
    "pools.PS-Eden-Space.used": {
      "value": 13879608
    },
    "pools.PS-Old-Gen.committed": {
      "value": 31457280
    },
    "pools.PS-Old-Gen.init": {
      "value": 88080384
    },
    "pools.PS-Old-Gen.max": {
      "value": 1395654656
    },
    "pools.PS-Old-Gen.usage": {
      "value": 0.018360885975505965
    },
    "pools.PS-Old-Gen.used": {
      "value": 25625456
    },
    "pools.PS-Survivor-Space.committed": {
      "value": 2097152
    },
    "pools.PS-Survivor-Space.init": {
      "value": 5242880
    },
    "pools.PS-Survivor-Space.max": {
      "value": 2097152
    },
    "pools.PS-Survivor-Space.usage": {
      "value": 0.0625
    },
    "pools.PS-Survivor-Space.used": {
      "value": 131072
    },
    "runnable.count": {
      "value": 4
    },
    "terminated.count": {
      "value": 0
    },
    "timed_waiting.count": {
      "value": 1
    },
    "total.committed": {
      "value": 148332544
    },
    "total.init": {
      "value": 134676480
    },
    "total.max": {
      "value": 1860698111
    },
    "total.used": {
      "value": 112001672
    },
    "waiting.count": {
      "value": 7
    }
  },
  "counters": {
    "KafkaClientActor.receiveCounter": {
      "count": 1443078
    }, 
    "foo.3.bar.GET-rejections": {
      "count": 1
    },
    "foo.3bar.GET-rejections": {
      "count": 1
     },
     "foo.4.bar.GET-rejections": {
       "count": 1
     },
     "health.GET-2xx": {
       "count": 1
     },
     "metrics.GET-2xx": {
       "count": 5
     }   
  },
  "histograms": {},
  "meters": {
    "KafkaClientActor.receiveExceptionMeter": {
      "count": 0,
      "m15_rate": 0,
      "m1_rate": 0,
      "m5_rate": 0,
      "mean_rate": 0,
      "units": "events/second"
    }
  },
  "timers": {
    "KafkaClientActor.receiveTimer": {
      "count": 1443078,
      "max": 0.496106,
      "mean": 0.023955427605185976,
      "min": 0.00855,
      "p50": 0.013158,
      "p75": 0.015818,
      "p95": 0.069989,
      "p98": 0.18145599999999998,
      "p99": 0.193686,
      "p999": 0.47478499999999996,
      "stddev": 0.04561406607191679,
      "m15_rate": 0.8672873098267513,
      "m1_rate": 0.8576046718431439,
      "m5_rate": 0.8704903354041494,
      "mean_rate": 0.34074311090084636,
      "duration_units": "milliseconds",
      "rate_units": "calls/second"
    },
    "RemoraKafkaConsumerGroupService.describe-timer": {
      "count": 1372542,
      "max": 3953.5592429999997,
      "mean": 165.67620936478744,
      "min": 4.631377,
      "p50": 22.125121,
      "p75": 124.258938,
      "p95": 527.534084,
      "p98": 800.1686119999999,
      "p99": 3316.226616,
      "p999": 3611.7097409999997,
      "stddev": 473.995637636751,
      "m15_rate": 0.8508541627113339,
      "m1_rate": 0.8450436821406069,
      "m5_rate": 0.8545541048945428,
      "mean_rate": 0.324087977369598,
      "duration_units": "milliseconds",
      "rate_units": "calls/second"
    },
    "RemoraKafkaConsumerGroupService.list-timer": {
      "count": 70536,
      "max": 2167.1663869999998,
      "mean": 163.13534839326368,
      "min": 56.275192999999994,
      "p50": 162.584495,
      "p75": 162.584495,
      "p95": 162.584495,
      "p98": 200.345285,
      "p99": 200.345285,
      "p999": 437.69862,
      "stddev": 23.321317038931596,
      "m15_rate": 0.016617378383700615,
      "m1_rate": 0.015343754688965648,
      "m5_rate": 0.016501030706405084,
      "mean_rate": 0.016655133007592124,
      "duration_units": "milliseconds",
      "rate_units": "calls/second"
    },
    "metrics.GET": {
      "count": 2,
      "max": 174.712404,
      "mean": 88.26670169568574,
      "min": 4.375856,
      "p50": 4.375856,
      "p75": 174.712404,
      "p95": 174.712404,
      "p98": 174.712404,
      "p99": 174.712404,
      "p999": 174.712404,
      "stddev": 85.15869346735195,
      "m15_rate": 0,
      "m1_rate": 0,
      "m5_rate": 0,
      "mean_rate": 0.6714371986436051,
      "duration_units": "milliseconds",
      "rate_units": "calls/second"
      }
  }
}

Configuring Remora

Additional configuration can be passed via the following environment variables:

  • SERVER_PORT - default 9000
  • KAFKA_ENDPOINT - default localhost:9092
  • ACTOR_TIMEOUT - default 60 seconds
  • AKKA_HTTP_SERVER_REQUEST_TIMEOUT - default 60 seconds
  • AKKA_HTTP_SERVER_IDLE_TIMEOUT - default 60 seconds
  • TO_REGISTRY - default false reports lag/offset/end to metricsRegistry
  • EXPORT_METRICS_INTERVAL_SECONDS - default 20 interval to report lag/offset/end to metricsRegistry

Configuring Remora with Cloudwatch

The following environment variables can be used to configure reporting to Cloudwatch:

  • CLOUDWATCH_ON - default false reports metricsRegistry to cloudwatch, TO_REGISTRY will need to be switched on!
  • CLOUDWATCH_NAME - default 'remora' name to appear on cloudwatch
  • CLOUDWATCH_METRIC_FILTER - default '' metric names to filter on cloudwatch. Set the CLOUDWATCH_METRIC_FILTER variable to a regex string to filter out metric names that DO NOT match the regex.

Configuring Remora with Datadog

The following environment variables can be used to configure reporting to Datadog:

  • DATADOG_ON - default false reports metricsRegistry to Datadog, TO_REGISTRY will need to be switched on!
  • DATADOG_NAME - default 'remora' name to appear on datadog
  • DATADOG_INTERVAL_MINUTES - default '1' The reporting interval, in minutes.
  • DATADOG_AGENT_HOST - default 'localhost' The host on which a Datadog agent is running.
  • DATADOG_AGENT_PORT - default '8125' The port of the Datadog agent.
  • DATADOG_CONSUMER_GROUPS - default '[]' List of consumer groups for which metrics will be sent to Datadog. An empty list means that all metrics will be sent.

Reporting to datadog agent:

Reporting to Datadog is done via DogStatsD, which is usually running on the same host as remora. However, as Remora is running inside a docker container, some steps are required to make the integration:

  • Set DATADOG_AGENT_HOST as the address of the host on your machine
  • In the datadog agent configuration, set non_local_traffic: yes

This way, a docker container running Remora will be able to communicate with a Datadog agent on the host machine.

Building from source

Prerequisites

  • Scala
  • SBT

Build

Create docker image locally. The image will be built to remora:0.1.0-SNAPSHOT by default.

$ sbt docker:publishLocal

Contributing

We are happy to accept contributions. First, take a look at our contributing guidelines.

TODO

Please check the Issues Page for contribution ideas.

Contact

Feel free to contact one of the maintainers.

License

MIT

remora's People

Contributors

bocytko avatar brendanmaguire avatar conorclifford avatar dr4ke616 avatar dtrsan avatar fmaali avatar fokusferit avatar hjacobs avatar imduffy15 avatar jaelee-branch avatar javierarrieta avatar leighlondon avatar marky-mark avatar nsanglar avatar onecricketeer avatar pawelgrzes avatar prakashkumar-patel avatar vlal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

remora's Issues

Dockerfile in repo?

Any reason the Dockerfile is not in the repo? We'd love to be able to build our own images

remora sending remora.gauge.lag without partition

when using the
DATADOG_REMOVE_TAGS_FROM_METRIC_NAME option
(that removes the partition name from the remora.gauge.lag metric)
it sends also the metric without a partition

U 127.0.0.1:55633 -> 127.0.0.1:8125
  remora.gauge.lag:287132281|g|#partition:99,group:myGroup,topic:myTopic
#
U 127.0.0.1:55633 -> 127.0.0.1:8125
  remora.gauge.lag:14333332827|g|#group:myGroup,topic:myTopic

any way to modify the
src/test/scala/reporter/RemoraDatadogReporterSpec.scala

to not send remora.gauge.lag if there is no partition?

Use CloudWatch dimensions

We're using Remora for exporting consumer group lag to CloudWatch metrics. Thanks for open sourcing this!

The issue

Metrics are currently exported as follows:

Screenshot from 2020-01-02 11-16-50
Screenshot from 2020-01-02 11-17-56

This limits how they can be queried (for example in Grafana). When creating a single graph that shows the lag for all partitions in a certain consumer group, you have to add a query for each of them individually. This is because you can't do wildcard searches on metric a name. Grafana allows for up to 5 CloudWatch searches in a single panel, so a maximum of 5 partitions can be plotted.

It is possible to do wildcard searches on dimensions though. This way, you would be able to do a single query that displays all partition offsets regardless of the number of partitions.

Proposed solution

I propose we change how metrics are exported to CloudWatch:

  • Metric name: By consumer group.<Consumer group id>.<metric> where is one of 'lag', 'logend' and 'offset'
  • Metric dimensions:
    • Topic (e.g. 'MyTopic')
    • Partition (e.g. '2')

For internal metrics like KafkaClientActor.receiveCounter:

  • Metric name: Remora internals.<metric> where is the same as what it is now
  • Metric dimensions:
    • metricType (e.g. 'gauge' or 'counterCount')

This would be a breaking change, so we'd have to change the version to 2.0.0.

More info on CloudWatch dimensions: https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html

What do you think?

Metric registry incorrectly refreshed

I realized that I introduced a bug in my latest PR, the metric registry was actually not freshed once a metric was registered...
Sorry for that, I will push a PR in the next 2 minutes

Support exporting to CloudWatch

It would be neat to be able to automatically scale out an ASG of Kafka Consumers based on their consumer group lag.

With Remora at the moment, this would be possible if you had something like lambda to query it on interval and submit the metrics to CloudWatch. However, not all organizations allow usage of lambda. It would be useful if Remora could push these 1) on interval or 2) on request.

Timeout on querying certain topics

Running against Kafka 10.2.1 we've seen akka timeouts occur when querying for lag against certain topics.

Logs do not contain much information:

/var/log/application.log  Apr 25 13:03:43 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Describing group <removed> via admin client  
/var/log/application.log  Apr 25 13:03:43 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:43 PM RemoraKafkaConsumerGroupService RemoraKafkaConsumerGroupService$$createAdminClient  
/var/log/application.log  Apr 25 13:03:43 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Creating admin client  
/var/log/application.log  Apr 25 13:03:43 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:43 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:43 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: Apr 25, 2017 1:03:44 PM RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$3$$anonfun$apply$4$$anonfun$4 apply  
/var/log/application.log  Apr 25 13:03:44 ip-172-31-143-50 docker/f96e2220abfa[851]: INFO: Querying kafka on consumer  

Kafaka 2.0 support

My team is currently using Burrow and we are running into some possible scaling issues. We found your project while looking at other tools and are interested in looking at it. We are also looking at an upgrade to Kafka 2.0 and were wondering if support for 2.0 is on you near term roadmap.

Thanks,
Eric Garcia

Zalando repository

Hey!

I have a question regarding your repository registry.opensource.zalan.do/dougal/remora. Is it building a new image on every commit? And how are the images tagged? I tried to use the commit hash but it didn't work.

My real problem is that you can't use the latest tag with Kubernetes, you must change the tag to pull a new image.

Thanks!
/Simon

Prometheus Exporter

Hi all,
i think remora is a good alternatives to other lag monitoring tools.
There's some chance to have a prometheus metrics exporter?
Or someone can help me to write it by myself?

Thanks

finding remora logs & using kafka 2.2.0

im getting a message to check the logs in the container

curl http://localhost:9000/consumers/my_topic 
Internal Error! Please check logs

i tried to find it inside the container

docker exec -it root_remora-streams_1 /bin/bash

/opt/docker/logs$ ls -ll
total 0

any idea where i can see the logs?
im trying to use remora on my 2.2.0 kafka cluster, on 2.1.0 it works just fine.

Improve datadog metric name formatter

Hey,
I noticed that while we add relevant "tags" to the datadog reporter, it's still keeping those tags in the metric name - which makes the usage of tags almost redundant.

Solution:
Supply a configuration to the metric name formatter to drop the "tags" from the metric name.

Issue running remora

Hi,

I've tried to run, but on sbt docker:publishLocal I've received exception:
[info] Done packaging. [error] Error response from daemon: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full. java.lang.RuntimeException: Nonzero exit value: 1 at com.typesafe.sbt.packager.docker.DockerPlugin$.publishLocalDocker(DockerPlugin.scala:296) at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings$14.apply(DockerPlugin.scala:109) at com.typesafe.sbt.packager.docker.DockerPlugin$$anonfun$projectSettings$14.apply(DockerPlugin.scala:108) at scala.Function4$$anonfun$tupled$1.apply(Function4.scala:35) at scala.Function4$$anonfun$tupled$1.apply(Function4.scala:34) at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47) at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40) at sbt.std.Transform$$anon$4.work(System.scala:63) at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226) at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:226) at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17) at sbt.Execute.work(Execute.scala:235) at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226) at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:226) at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159) at sbt.CompletionService$$anon$2.call(CompletionService.scala:28) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) [error] (docker:publishLocal) Nonzero exit value: 1 [error] Total time: 15 s, completed May 28, 2017 6:04:19 PM

Tried to run from Intellij, but request to http://localhost:9000/consumers returned _ Internal Error! Please check logs _
exception:
[remora-akka.actor.default-dispatcher-7] DEBUG akka.io.TcpListener - Successfully bound to /0:0:0:0:0:0:0:0:9000 [remora-akka.actor.default-dispatcher-7] DEBUG akka.io.TcpListener - New connection accepted [remora-akka.actor.default-dispatcher-6] ERROR a.actor.ActorSystemImpl - Request received an exception: Timeout length must be positive, question not sent to [Actor[akka://remora/user/kafka-client-actor#-1606370397]]. Sender[null] sent the message of type "KafkaClientActor$ListConsumers$". java.lang.IllegalArgumentException: Timeout length must be positive, question not sent to [Actor[akka://remora/user/kafka-client-actor#-1606370397]]. Sender[null] sent the message of type "KafkaClientActor$ListConsumers$". at akka.pattern.AskableActorRef$.internalAsk$extension(AskSupport.scala:292) at akka.pattern.AskableActorRef$.$qmark$extension1(AskSupport.scala:281) at Api.Api$$askFor(Api.scala:51) at Api$$anonfun$2$$anonfun$apply$2$$anonfun$apply$6$$anonfun$apply$7$$anonfun$apply$8.apply(Api.scala:64) at Api$$anonfun$2$$anonfun$apply$2$$anonfun$apply$6$$anonfun$apply$7$$anonfun$apply$8.apply(Api.scala:64)

What I'm doing wrong ?

Support for brokers which require authentication

Currently it seems to not be possible to use Remora with brokers which require authentication (for example SASL_SSL).
My idea is to extend Remora to have an additional environment variable which would allow to execute behind the scenes a command similar to the following example:

kafka-consumer-groups --bootstrap-server local:9094 --describe --group my-group --command-config auth.properties

where auth.properties content would look like to the following:
security.protocol=SASL_SSL sasl.mechanism=SCRAM-SHA-256 sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="my-user" password="my-password";

Make admin client more configurable

As user
I want to configure admin client via environment variables
So that I can change remoras behaviour at runtime

Description

Currently I believe that it is not possible to add additional properties to admin client via environment variables.
https://github.com/zalando-incubator/remora/blob/master/src/main/resources/application.conf#L24

How I would like to use this feature ?

  • I run remora in a kubernetes environment and I want to connect remora to AWS MSK instance that has SSL enabled between client and broker. I would like to supply SSL security.protocol to the admin client via kubernetes environment variable or configMaps.

Acceptance criteria

  • A user should be able to configure properties of the admin-client e.g security.protocol via environment variables

Support Multiple Clusters

Rather than deploying one Remora instance per cluster, how about one instance that can access multiple clusters?

Proposal

  1. Update configuration
kafka [
  {
    name = "clusterA"
    endpoint = "localhost:9092"
    endpoint = ${?KAFKA_ENDPOINT[0]}
    command {
      config = ""
      config = ${?KAFKA_COMMAND_CONFIG[0]}
    }
  },
  {
    name = "clusterB"
    endpoint = "localhost:6667"
    endpoint = ${?KAFKA_ENDPOINT[1]}
    command {
      config = ""
      config = ${?KAFKA_COMMAND_CONFIG[1]}
    }
  }
}
  1. Update REST resources
  • If len(clusters) == 1, take current behavior (possibly via redirects)
  • Else, require /clusterX/ in route, and 404 for any cluster name not found

Filter metrics sent to cloudwatch

When using CLOUDWATCH_ON=true, it would be helpful to have some mechanism for filtering the metrics with a whitelist or blacklist. For example, we use the lag metrics heavily but don't have a lot of use for logend or offset metrics. Also, in some cases we want individual partition metrics and other times not. It may become a bit cost-prohibitive to continue sending all metrics to cloudwatch.

Remora not sending metrics if one of the endpoints down

we have multiple endpoints to our kafka cluster

version: "2"
services:

  remora-kafka:
    image: remora:latest
    environment:
      KAFKA_ENDPOINT: "kafka1.our_domain:9092,kafka2.our_domain:9092,kafka3.our_domain:9092,kafka4.our_domain:9092"
      DATADOG_ON: "true"
      SERVER_PORT: "9019"
      TO_REGISTRY: "true"
      DATADOG_AGENT_HOST: "localhost"
      DATADOG_REMOVE_TAGS_FROM_METRIC_NAME: "true"
    ports:
      - 9019:9019
    restart: always
    network_mode: "host"

when one of the endpoint brokers failed ( shut down because of any reason )
instead of working against one of the other brokers it just starting to send only its failure in the logs

2019-05-20 08:31:49,513 - [DEBUG] - [remora-kafka-consumer-dispatcher-83] kafka.admin.AdminClient - Request FIND_COORDINATOR failed against node kafka2.our_domain:9092 (id: -4 rack: null)
org.apache.kafka.common.errors.DisconnectException: null
2019-05-20 08:31:49,515 - [DEBUG] - [remora-kafka-consumer-dispatcher-85] kafka.admin.AdminClient - Request FIND_COORDINATOR failed against node kafka2.our_domain:9092 (id: -5 rack: null)
org.apache.kafka.common.errors.DisconnectException: null
2019-05-20 08:31:49,515 - [DEBUG] - [remora-kafka-consumer-dispatcher-85] kafka.admin.AdminClient - Request FIND_COORDINATOR failed against node kafka2.our_domain:9092 (id: -4 rack: null)

any way to make it work with the other working brokers?

thanks a lot,
Arnold

Datadog dashboard

Hey and thank you for a great project!

I have tried to setup a "dynamic" dashboard in Datadog in the sense that the topics/partitions and consumer group lags are automatically added to a graph. But I can't find a way to use wildcard or regular expressions in the metric name. Have you solved this in a more dynamic way? Or have you manually added all topics/partitions for each consumer group?

Best regards,
Simon

Make logging level configurable

Hey, as of now Remora is generating a lot of logs on debug level, is it currently to possible to manage the log level via configuration?

Assembly fails due to dependency issues

When I run sbt assembly to try and produce a JAR to run natively, it passes all of the tests but produces errors on the last stage due to log4j showing up in log4j-over-slf4j and in a transitive dependency of the "real" log4j.

[error] 29 errors were encountered during merge
java.lang.RuntimeException: deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Appender.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Appender.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/AppenderSkeleton.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/AppenderSkeleton.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/BasicConfigurator.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/BasicConfigurator.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Category.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Category.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/ConsoleAppender.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/ConsoleAppender.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/FileAppender.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/FileAppender.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Layout.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Layout.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Level.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Level.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/LogManager.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/LogManager.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Logger.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Logger.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/MDC.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/MDC.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/NDC.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/NDC.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/PatternLayout.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/PatternLayout.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Priority.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Priority.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/PropertyConfigurator.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/PropertyConfigurator.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/RollingFileAppender.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/RollingFileAppender.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/SimpleLayout.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/SimpleLayout.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/WriterAppender.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/WriterAppender.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/helpers/LogLog.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/helpers/LogLog.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/helpers/NullEnumeration.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/helpers/NullEnumeration.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/Configurator.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/Configurator.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/ErrorHandler.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/ErrorHandler.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/Filter.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/Filter.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/HierarchyEventListener.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/HierarchyEventListener.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/LoggerFactory.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/LoggerFactory.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/LoggerRepository.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/LoggerRepository.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/LoggingEvent.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/LoggingEvent.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/OptionHandler.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/OptionHandler.class
deduplicate: different file contents found in the following:
/Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/xml/DOMConfigurator.class
/Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/xml/DOMConfigurator.class
	at sbtassembly.Assembly$.applyStrategies(Assembly.scala:140)
	at sbtassembly.Assembly$.x$1$lzycompute$1(Assembly.scala:25)
	at sbtassembly.Assembly$.x$1$1(Assembly.scala:23)
	at sbtassembly.Assembly$.stratMapping$lzycompute$1(Assembly.scala:23)
	at sbtassembly.Assembly$.stratMapping$1(Assembly.scala:23)
	at sbtassembly.Assembly$.inputs$lzycompute$1(Assembly.scala:67)
	at sbtassembly.Assembly$.inputs$1(Assembly.scala:57)
	at sbtassembly.Assembly$.apply(Assembly.scala:83)
	at sbtassembly.Assembly$$anonfun$assemblyTask$1.apply(Assembly.scala:240)
	at sbtassembly.Assembly$$anonfun$assemblyTask$1.apply(Assembly.scala:237)
	at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
	at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:40)
	at sbt.std.Transform$$anon$4.work(System.scala:63)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:228)
	at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
	at sbt.Execute.work(Execute.scala:237)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:228)
	at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:159)
	at sbt.CompletionService$$anon$2.call(CompletionService.scala:28)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
[error] (*:assembly) deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Appender.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Appender.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/AppenderSkeleton.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/AppenderSkeleton.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/BasicConfigurator.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/BasicConfigurator.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Category.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Category.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/ConsoleAppender.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/ConsoleAppender.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/FileAppender.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/FileAppender.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Layout.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Layout.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Level.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Level.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/LogManager.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/LogManager.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Logger.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Logger.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/MDC.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/MDC.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/NDC.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/NDC.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/PatternLayout.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/PatternLayout.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/Priority.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/Priority.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/PropertyConfigurator.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/PropertyConfigurator.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/RollingFileAppender.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/RollingFileAppender.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/SimpleLayout.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/SimpleLayout.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/WriterAppender.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/WriterAppender.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/helpers/LogLog.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/helpers/LogLog.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/helpers/NullEnumeration.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/helpers/NullEnumeration.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/Configurator.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/Configurator.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/ErrorHandler.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/ErrorHandler.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/Filter.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/Filter.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/HierarchyEventListener.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/HierarchyEventListener.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/LoggerFactory.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/LoggerFactory.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/LoggerRepository.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/LoggerRepository.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/LoggingEvent.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/LoggingEvent.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/spi/OptionHandler.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/spi/OptionHandler.class
[error] deduplicate: different file contents found in the following:
[error] /Users/username/.ivy2/cache/org.slf4j/log4j-over-slf4j/jars/log4j-over-slf4j-1.7.22.jar:org/apache/log4j/xml/DOMConfigurator.class
[error] /Users/username/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.16.jar:org/apache/log4j/xml/DOMConfigurator.class
[error] Total time: 38 s, completed 19/09/2018 11:32:33 AM

Error reading field 'version': java.nio.BufferUnderflowException

I get an error when used about 7days.

the API interface tell about "Internal Error! Please check logs"

2018-04-10 06:57:59,785 - [DEBUG] - [remora-akka.actor.default-dispatcher-95] akka.io.TcpListener - New connection accepted
2018-04-10 06:57:59,801 - [INFO] - [remora-akka.actor.default-dispatcher-95] KafkaClientActor - Received request for consumer list
2018-04-10 06:58:06,134 - [DEBUG] - [remora-akka.actor.default-dispatcher-105] akka.io.TcpListener - New connection accepted
2018-04-10 06:58:06,142 - [INFO] - [remora-akka.actor.default-dispatcher-105] KafkaClientActor - Received request for group_new_device_teu
2018-04-10 06:58:06,176 - [ERROR] - [remora-akka.actor.default-dispatcher-107] akka.actor.ActorSystemImpl - Request received an exception: Error reading field 'version': java.nio.BufferUnderflowException
org.apache.kafka.common.protocol.types.SchemaException: Error reading field 'version': java.nio.BufferUnderflowException
at org.apache.kafka.common.protocol.types.Schema.read(Schema.java:76)
at org.apache.kafka.clients.consumer.internals.ConsumerProtocol.deserializeAssignment(ConsumerProtocol.java:105)
at kafka.admin.AdminClient$$anonfun$12.apply(AdminClient.scala:326)
at kafka.admin.AdminClient$$anonfun$12.apply(AdminClient.scala:323)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at kafka.admin.AdminClient.describeConsumerGroup(AdminClient.scala:323)
at kafka.admin.ConsumerGroupCommand$KafkaConsumerGroupService.collectGroupAssignment(ConsumerGroupCommand.scala:428)
at kafka.admin.ConsumerGroupCommand$ConsumerGroupService$class.describeGroup(ConsumerGroupCommand.scala:173)
at kafka.admin.ConsumerGroupCommand$KafkaConsumerGroupService.describeGroup(ConsumerGroupCommand.scala:416)
at RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$2.apply(RemoraKafkaConsumerGroupService.scala:54)
at RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1$$anonfun$apply$2.apply(RemoraKafkaConsumerGroupService.scala:51)
at nl.grons.metrics.scala.Timer.time(Timer.scala:54)
at RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1.apply(RemoraKafkaConsumerGroupService.scala:51)
at RemoraKafkaConsumerGroupService$$anonfun$describeConsumerGroup$1.apply(RemoraKafkaConsumerGroupService.scala:51)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:39)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:415)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Better Healthcheck

the current health check is "OK"...no pun intended. ๐Ÿ˜€

Better if we can have a kafka healthcheck in the body aswell

Clarify Burrow "performance problems"

In the README, says "performance problems" were experienced with Burrow, therefore this repo was created.

I assume that the issues were with management of the Golang client/API, as compared to the JVM Kafka clients, but if so or even not, can some clarification be added as to why someone may "chose" this over the alternative of Burrow?

Adding total consumer lag per topic

Currently, remora publishes consumer lag at the partition level.
While it gives detailed information on the consumers, it would be nice to directly have the consumer lag for a topic (by adding the lag of each partition) .

This is helpful when using monitoring services such as datadog, since currently each metric for each partition needs to be aggregated in order to have a quick view on the system health.

Log in JSON format

Provide JSON logger that would integrate easily with log management tools like scalyr

Adding Datadog as a reporting system

Hi,

First of all, thanks for this small tool, it really helped us to monitor our Kafka applications.

Remora currently supports reporting via HTTP and Cloudwatch, and I would propose to add a new reporting system: Datadog. It is straightforward to implement, as there is an integration with Dropwizard metrics.

We already use this integration for our projects, I will post a PR soon.

SASL SSL Example?

Is it possible to use this application with SASL SSL authentication? I'm having a hard time figuring out if it's possible, and if so, how. Help appreciated!

Real Acceptance tests

Build the docker, launch a docker compose and run some acceptance tests against the image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.