Search code examples
scalafinagle

Empty metrics in TwitterServer


I'm trying to run a simple TwitterServer with implementation from https://twitter.github.io/twitter-server/Features.html

After several requests to the http://localhost:9990/echo I haven't see any metric in http://localhost:9990/admin/metrics. After debugging I found that the actual StatsReceiver is NullStatsReceiver. I haven't found any mentioning of StatsReceiver configuration in a documentation.

So how can I change the default NullStatsReceiver?

import com.twitter.conversions.time._
import com.twitter.finagle.http.{HttpMuxer, Request, Response, Status}
import com.twitter.finagle.Service
import com.twitter.logging.Formatter
import com.twitter.server.TwitterServer
import com.twitter.util.{Await, Future, Time}
import java.net.InetSocketAddress

object AdvancedServer extends TwitterServer {

  val what = flag("what", "hello", "String to return")
  val addr = flag("bind", new InetSocketAddress(0), "Bind address")
  val durations = flag("alarms", (1.second, 5.second), "2 alarm durations")
  val counter = statsReceiver.counter("requests_counter")
  override def defaultFormatter = new Formatter(
    timezone = Some("UTC"),
    prefix = "<yyyy-MM-dd HH:mm:ss.SSS> [%.3s] %s: "
  )
  override def failfastOnFlagsNotParsed: Boolean = true

  val service = new Service[Request, Response] {
    def apply(request: Request) = {
      log.debug("Received a request at " + Time.now)
      counter.incr()
      val response = Response(request.version, Status.Ok)
      response.contentString = what() + "\n"
      Future.value(response)
    }
  }

  def main() {
    // We could create a new http server but in this case we use the
    // one already started for /admin/* endpoints.
    // The `TwitterServer` trait exposes an `adminHttpServer` that serve all routes
    // registered in the HttpMuxer object, we just have to add our own.
    HttpMuxer.addHandler("/echo", service)
    HttpMuxer.addHandler("/echo/", service)
    // And wait on the server
    Await.ready(adminHttpServer)
  }
}

Solution

  • I guess I've found the solution. Firstly it's needed to add finagle-stats dependency. I've used v6.43.0. Secondly it's needed to define the counter as

    val counter = MetricsStatsReceiver.defaultRegistry.createCounter("requests_counter").

    Then it will works as expected.