๐ซ Reach me at:
rlazoti / finagle-metrics Goto Github PK
View Code? Open in Web Editor NEWEasy way to send Finagle metrics to Codahale Metrics library
License: MIT License
Easy way to send Finagle metrics to Codahale Metrics library
License: MIT License
Hi,
I tried using finagle-metrics
0.10 along with Finagle 7.1.0 and I get bombarded with:
java.lang.IllegalArgumentException: A metric named clnt.some-client-name.connections already exists
at com.codahale.metrics.MetricRegistry.register(MetricRegistry.java:91)
at com.twitter.finagle.metrics.MetricsStatsReceiver$MetricGauge.<init>(MetricsStatsReceiver.scala:27)
at com.twitter.finagle.metrics.MetricsStatsReceiver.addGauge(MetricsStatsReceiver.scala:51)
at com.twitter.finagle.stats.BroadcastStatsReceiver$Two$$anon$1.<init>(BroadcastStatsReceiver.scala:29)
...
I was unable to reproduce this locally, but it happens all the time on a server with real traffic. Probably because the problem requires many concurrent requests to become manifest.
My suspicions fall on this block of code. Although the calls inside the MetricGauge
are synchronized, the calls to addGauge
are not.
Can it be that multiple clients are calling addGauge
all at once and each manages to invoke metrics.register
independently?
Can you publish this to a repository so we can use it directly instead of building it locally? Or are there any issues you are aware of why you don't want to share this?
Hi, I would like to update the versions of finagle and dropwizard metrics, so I can continue using this library in my project. I have created #14. It compiles fine locally, however Travis CI is failing https://travis-ci.org/github/rlazoti/finagle-metrics/builds/669016934?utm_source=github_status&utm_medium=notification
Could you please help resolve this, and merge my PR if you approve?
Thanks
Now that 2.12 is stable, could you start cross-publishing for 2.12? finagle-core is cross-published for 2.12 starting with 6.41.0.
Hello,
This is a pretty strange bug report but after upgrading to 0.0.4
we're seeing the following errors when generating coverageReports with scoverage. This is with finagle 6.40 and scalatest 3.0.0.
[info] service.FeatureTest *** ABORTED ***
[info] java.lang.ExceptionInInitializerError:
[info] at com.twitter.finagle.util.DefaultTimer$.<init>(HashedWheelTimer.scala:170)
[info] at com.twitter.finagle.util.DefaultTimer$.<clinit>(HashedWheelTimer.scala)
[info] at com.twitter.finagle.stats.JsonExporter.<init>(JsonExporter.scala:65)
[info] at com.twitter.finagle.stats.MetricsExporter.<init>(MetricsStatsReceiver.scala:334)
[info] at com.twitter.finagle.stats.MetricsExporter.<init>(MetricsStatsReceiver.scala:338)
[info] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[info] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
[info] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[info] at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
[info] at java.lang.Class.newInstance(Class.java:442)
[info] ...
[info] Cause: java.io.FileNotFoundException: /Users/rodrigolazoti/Projects/Framework/Scala/finagle-metrics/target/scala-2.11/scoverage-data/scoverage.measurements.145 (No such file or directory)
[info] at java.io.FileOutputStream.open0(Native Method)
[info] at java.io.FileOutputStream.open(FileOutputStream.java:270)
[info] at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
[info] at java.io.FileWriter.<init>(FileWriter.java:107)
[info] at scoverage.Invoker$$anonfun$1.apply(Invoker.scala:42)
[info] at scoverage.Invoker$$anonfun$1.apply(Invoker.scala:42)
[info] at scala.collection.concurrent.TrieMap.getOrElseUpdate(TrieMap.scala:901)
[info] at scoverage.Invoker$.invoked(Invoker.scala:42)
[info] at com.twitter.finagle.metrics.MetricsStatsReceiver.stat(MetricsStatsReceiver.scala:49)
[info] at com.twitter.finagle.stats.BroadcastStatsReceiver$Two.stat(BroadcastStatsReceiver.scala:24)
[info] ...
java.lang.ExceptionInInitializerError
at com.twitter.finagle.util.DefaultTimer$.<init>(HashedWheelTimer.scala:170)
at com.twitter.finagle.util.DefaultTimer$.<clinit>(HashedWheelTimer.scala)
at com.twitter.finagle.stats.JsonExporter.<init>(JsonExporter.scala:65)
at com.twitter.finagle.stats.MetricsExporter.<init>(MetricsStatsReceiver.scala:334)
at com.twitter.finagle.stats.MetricsExporter.<init>(MetricsStatsReceiver.scala:338)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at com.twitter.app.LoadService$$anonfun$5.apply(LoadService.scala:74)
at com.twitter.app.LoadService$$anonfun$5.apply(LoadService.scala:63)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
at com.twitter.app.LoadService$.apply(LoadService.scala:63)
at com.twitter.finagle.util.LoadService$.apply(LoadService.scala:14)
at com.twitter.finagle.http.HttpMuxer$.<init>(HttpMuxer.scala:122)
at com.twitter.finagle.http.HttpMuxer$.<clinit>(HttpMuxer.scala)
at com.twitter.server.Lifecycle$class.$init$(Lifecycle.scala:14)
at service.ApplicationServer.<init>(ApplicationServer.scala:15)
at service.FeatureTest .<init>(FeatureTest.scala:24)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:435)
at sbt.TestRunner.runTest$1(TestFramework.scala:76)
at sbt.TestRunner.run(TestFramework.scala:85)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
at sbt.TestFunction.apply(TestFramework.scala:207)
at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.FileNotFoundException: /Users/rodrigolazoti/Projects/Framework/Scala/finagle-metrics/target/scala-2.11/scoverage-data/scoverage.measurements.145 (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileWriter.<init>(FileWriter.java:107)
at scoverage.Invoker$$anonfun$1.apply(Invoker.scala:42)
at scoverage.Invoker$$anonfun$1.apply(Invoker.scala:42)
at scala.collection.concurrent.TrieMap.getOrElseUpdate(TrieMap.scala:901)
at scoverage.Invoker$.invoked(Invoker.scala:42)
at com.twitter.finagle.metrics.MetricsStatsReceiver.stat(MetricsStatsReceiver.scala:49)
at com.twitter.finagle.stats.BroadcastStatsReceiver$Two.stat(BroadcastStatsReceiver.scala:24)
at com.twitter.finagle.stats.StatsReceiverProxy$class.stat(StatsReceiverProxy.scala:9)
at com.twitter.finagle.stats.LoadedStatsReceiver$.stat(LoadedStatsReceiver.scala:9)
at com.twitter.finagle.stats.NameTranslatingStatsReceiver.stat(NameTranslatingStatsReceiver.scala:29)
at com.twitter.finagle.stats.StatsReceiverProxy$class.stat(StatsReceiverProxy.scala:9)
at com.twitter.finagle.stats.FinagleStatsReceiver$.stat(LoadedStatsReceiver.scala:36)
at com.twitter.finagle.stats.NameTranslatingStatsReceiver.stat(NameTranslatingStatsReceiver.scala:29)
at com.twitter.finagle.util.TimerStats$.deviation(TimerStats.scala:27)
at com.twitter.finagle.util.HashedWheelTimer$.<init>(HashedWheelTimer.scala:155)
at com.twitter.finagle.util.HashedWheelTimer$.<clinit>(HashedWheelTimer.scala)
at com.twitter.finagle.util.DefaultTimer$.<init>(HashedWheelTimer.scala:170)
at com.twitter.finagle.util.DefaultTimer$.<clinit>(HashedWheelTimer.scala)
at com.twitter.finagle.stats.JsonExporter.<init>(JsonExporter.scala:65)
at com.twitter.finagle.stats.MetricsExporter.<init>(MetricsStatsReceiver.scala:334)
at com.twitter.finagle.stats.MetricsExporter.<init>(MetricsStatsReceiver.scala:338)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at com.twitter.app.LoadService$$anonfun$5.apply(LoadService.scala:74)
at com.twitter.app.LoadService$$anonfun$5.apply(LoadService.scala:63)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
at com.twitter.app.LoadService$.apply(LoadService.scala:63)
at com.twitter.finagle.util.LoadService$.apply(LoadService.scala:14)
at com.twitter.finagle.http.HttpMuxer$.<init>(HttpMuxer.scala:122)
at com.twitter.finagle.http.HttpMuxer$.<clinit>(HttpMuxer.scala)
at com.twitter.server.Lifecycle$class.$init$(Lifecycle.scala:14)
at service.ApplicationServer.<init>(ApplicationServer.scala:15)
at service.FeatureTest .<init>(FeatureTest .scala:24)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.scalatest.tools.Framework$ScalaTestTask.execute(Framework.scala:435)
at sbt.TestRunner.runTest$1(TestFramework.scala:76)
at sbt.TestRunner.run(TestFramework.scala:85)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1$$anonfun$apply$8.apply(TestFramework.scala:202)
at sbt.TestFramework$.sbt$TestFramework$$withContextLoader(TestFramework.scala:185)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
at sbt.TestFramework$$anon$2$$anonfun$$init$$1.apply(TestFramework.scala:202)
at sbt.TestFunction.apply(TestFramework.scala:207)
at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
at sbt.Tests$$anonfun$9.apply(Tests.scala:216)
at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
at sbt.std.Transform$$anon$3$$anonfun$apply$2.apply(System.scala:44)
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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
[error] Could not run test service.FeatureTest : java.lang.ExceptionInInitializerError
Hey,
Even after applying the synchronized block for adding Gauge, I still get the exception about metric name is already exists
java.lang.IllegalArgumentException: A metric named clnt.dispatcher.serial.queue_size already exists at com.codahale.metrics.MetricRegistry.register(MetricRegistry.java:91) at com.twitter.finagle.metrics.MetricsStatsReceiver$MetricGauge.<init>(MetricsStatsReceiver.scala:46) at com.twitter.finagle.metrics.MetricsStatsReceiver.addGauge(MetricsStatsReceiver.scala:76) at com.twitter.finagle.stats.StatsReceiverProxy.addGauge(StatsReceiverProxy.scala:10) at com.twitter.finagle.stats.StatsReceiverProxy.addGauge$(StatsReceiverProxy.scala:10) at com.twitter.finagle.stats.LoadedStatsReceiver$.addGauge(LoadedStatsReceiver.scala:9) at com.twitter.finagle.stats.NameTranslatingStatsReceiver.addGauge(NameTranslatingStatsReceiver.scala:32) at com.twitter.finagle.stats.StatsReceiverProxy.addGauge(StatsReceiverProxy.scala:10) at com.twitter.finagle.stats.StatsReceiverProxy.addGauge$(StatsReceiverProxy.scala:10) at com.twitter.finagle.stats.ClientStatsReceiver$.addGauge(LoadedStatsReceiver.scala:46)
Any idea what could cause this case?
Hello,
I see that a similar issue had been logged in issue #2, the fix for which was to remove matching gauges prior to adding a new value. This seems to work in the general case but I've run into an issue where occassionally we'll see an issue such as A metric named clnt.some_label.queue_size already exists
. Especially when using Future.join or Future.collect which leads me to believe there is a data race between when the metric is checked and when it is actually written. I forked the repository and wrapped the call with this.synchronized{}
which appears to have fixed my own issue.
when i exported finagle internal metrics to codahale, i found so many metrics that i don't care about. could i disable some metrics?
Looks like there was a breaking API change in Finagle.
Seeing this in the logs and the startup fails
java.lang.AbstractMethodError: Method com/twitter/finagle/metrics/MetricsStatsReceiver.stat(Lcom/twitter/finagle/stats/Verbosity;Lscala/collection/Seq;)Lcom/twitter/finagle/stats/Stat; is abstract
Http Client runtime exception thrown at startup under finagle v6.35:
e.g.
Http.newService("172.18.10.98:9191")
results in IllegalArgumentException: A metric named inet.dns.queue_size already exists
oOo
sbt dependancies:
scalaVersion := "2.11.8"
val finagleVersion = "6.35.0"
libraryDependencies ++=
Seq("com.twitter" %% "finagle-core" ,
"com.twitter" %% "finagle-http" ).map(_ % finagleVersion withSources())
libraryDependencies ++= Seq("com.github.rlazoti" % "finagle-metrics_2.11" % "0.0.2")
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.