|
package dwgraphitedemo |
|
|
|
import java.lang.management.ManagementFactory |
|
import java.util.concurrent.TimeUnit |
|
|
|
import com.codahale.metrics.graphite.{Graphite, GraphiteReporter} |
|
import com.codahale.metrics.SharedMetricRegistries |
|
import com.codahale.metrics.jvm._ |
|
import com.twitter.finagle.http.{Request, Response, Status} |
|
import com.twitter.finagle.{Http, Service} |
|
import com.twitter.server.TwitterServer |
|
import com.twitter.util.{Await, Future} |
|
import nl.grons.metrics.scala.DefaultInstrumented |
|
|
|
object Main extends TwitterServer with DefaultInstrumented { |
|
private val appPort = getEnv("APP_PORT") |
|
private val graphiteHost = getEnv("GRAPHITE_HOST") |
|
private val graphitePort = getEnv("GRAPHITE_PORT").toInt |
|
|
|
private def getEnv(key: String): String = |
|
sys.env.getOrElse( |
|
key, |
|
sys.error(s"Please specify env var $key") |
|
) |
|
|
|
private val helloWorldCounter = metrics.counter("helloworld") |
|
|
|
override def failfastOnFlagsNotParsed: Boolean = true |
|
|
|
private val service = new Service[Request, Response] { |
|
override def apply(request: Request): Future[Response] = { |
|
helloWorldCounter.inc() |
|
log.debug("Got request to path " + request.path) |
|
val response = Response(request.version, Status.Ok) |
|
response.contentString = "Hello, world!\n" |
|
Future.value(response) |
|
} |
|
} |
|
|
|
def main(): Unit = { |
|
setupMetrics() |
|
|
|
val server = Http.server.serve(":" + appPort, service) |
|
onExit { |
|
server.close() |
|
} |
|
Await.ready(server) |
|
} |
|
|
|
private def setupMetrics(): Unit = { |
|
val metricRegistry = SharedMetricRegistries.getOrCreate("default") |
|
|
|
metricRegistry.register("jvm.gc", new GarbageCollectorMetricSet()) |
|
metricRegistry.register("jvm.memory", new MemoryUsageGaugeSet()) |
|
metricRegistry.register("jvm.threads", new ThreadStatesGaugeSet()) |
|
metricRegistry.register("jvm.fileDescriptor", new FileDescriptorRatioGauge()) |
|
metricRegistry.register("jvm.classLoading", new ClassLoadingGaugeSet()) |
|
metricRegistry.register("jvm.buffers", new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer)) |
|
|
|
val graphite = new Graphite(graphiteHost, graphitePort) |
|
val reporter = GraphiteReporter |
|
.forRegistry(metricRegistry) |
|
.prefixedWith("dwgraphitedemo") |
|
.build(graphite) |
|
|
|
reporter.start(10, TimeUnit.SECONDS) |
|
} |
|
} |