From 755600bd5737eb4f4c508b19044db7a3c6bc7660 Mon Sep 17 00:00:00 2001 From: keuhdall Date: Sat, 29 Jul 2023 03:30:31 +0200 Subject: [PATCH 1/2] add grafana example --- docs/examples/directory.conf | 1 + docs/examples/grafana/README.md | 212 ++++++++++++++++++ .../grafana/dashboards/metrics-dashboard.json | 180 +++++++++++++++ .../grafana/dashboards/traces-dashboard.json | 119 ++++++++++ docs/examples/grafana/metrics-grafana.png | Bin 0 -> 63164 bytes docs/examples/grafana/traces-grafana.png | Bin 0 -> 70727 bytes 6 files changed, 512 insertions(+) create mode 100644 docs/examples/grafana/README.md create mode 100644 docs/examples/grafana/dashboards/metrics-dashboard.json create mode 100644 docs/examples/grafana/dashboards/traces-dashboard.json create mode 100644 docs/examples/grafana/metrics-grafana.png create mode 100644 docs/examples/grafana/traces-grafana.png diff --git a/docs/examples/directory.conf b/docs/examples/directory.conf index 470ad58ed..edf642094 100644 --- a/docs/examples/directory.conf +++ b/docs/examples/directory.conf @@ -3,4 +3,5 @@ laika.title = Examples laika.navigationOrder = [ jaeger-docker honeycomb + grafana ] diff --git a/docs/examples/grafana/README.md b/docs/examples/grafana/README.md new file mode 100644 index 000000000..770c1d1b2 --- /dev/null +++ b/docs/examples/grafana/README.md @@ -0,0 +1,212 @@ +# Grafana - All-in-one + +In this example, we are going to use [Prometheus](https://prometheus.io/) and [Tempo](https://grafana.com/oss/tempo/), both displayed inside [Grafana](https://grafana.com/grafana/). +Just like [Jaeger example](../jaeger-docker/README.md), we will need to setup a collector to gather both metrics and traces. + +### Project setup + +Configure the project using your favorite tool, once again setup is similar to the Jaeger example, only difference being that we export metrics as they will be stored inside Prometheus: + +@:select(build-tool) + +@:choice(sbt) + +Add settings to the `build.sbt`: +```scala +libraryDependencies ++= Seq( + "org.typelevel" %% "otel4s-java" % "@VERSION@", // <1> + "io.opentelemetry" % "opentelemetry-exporter-otlp" % "@OPEN_TELEMETRY_VERSION@" % Runtime, // <2> + "io.opentelemetry" % "opentelemetry-sdk-extension-autoconfigure" % "@OPEN_TELEMETRY_VERSION@" % Runtime // <3> +) +run / fork := true +javaOptions += "-Dotel.java.global-autoconfigure.enabled=true" // <4> +javaOptions += "-Dotel.service.name=grafana-example" // <5> +``` + +@:choice(scala-cli) + +Add directives to the `grafana.scala`: +```scala +//> using scala 3.3.0 +//> using lib "org.typelevel::otel4s-java:@VERSION@" // <1> +//> using lib "io.opentelemetry:opentelemetry-exporter-otlp:@OPEN_TELEMETRY_VERSION@" // <2> +//> using lib "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:@OPEN_TELEMETRY_VERSION@" // <3> +//> using `java-opt` "-Dotel.java.global-autoconfigure.enabled=true" // <4> +//> using `java-opt` "-Dotel.service.name=grafana-example" // <5> +``` + +@:@ + +1) Add the `otel4s` library +2) Add an OpenTelemetry exporter. Without the exporter, the application will crash +3) Add an OpenTelemetry autoconfigure extension +4) Enable OpenTelemetry SDK autoconfigure mode +5) Add the name of the application to use in the traces + + +### OpenTelemetry SDK configuration + +As mentioned above, we use `otel.service.name` and `otel.metrics.exporter` system properties to configure the +OpenTelemetry SDK. +The SDK can be configured via environment variables too. Check the full list +of [environment variable configurations](https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/autoconfigure/README.md) +for more options. + +### Observability stack configuration + +Use the following `docker-compose.yaml` file: + +```yaml +version: '3.7' +services: + otel4s-grafana-example: + image: otel4s-grafana-example:0.1.0-SNAPSHOT + environment: + OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" + restart: on-failure + ports: + - "8080:8080" + networks: + - static-network + + otel-collector: + image: otel/opentelemetry-collector-contrib + command: [--config=/etc/otel-collector-config.yaml] + volumes: + - ./dependencies/opentelemetry/otel-collector-config.yaml:/etc/otel-collector-config.yaml + ports: + - "8888:8888" # Prometheus metrics exposed by the collector + - "8889:8889" # Prometheus exporter metrics + - "4317:4317" # OTLP gRPC receiver + - "4318:4318" # OTLP http receiver + networks: + - static-network + + jaeger: + image: jaegertracing/all-in-one:latest + volumes: + - "./dependencies/jaeger/jaeger-ui.json:/etc/jaeger/jaeger-ui.json" + command: --query.ui-config /etc/jaeger/jaeger-ui.json + environment: + - METRICS_STORAGE_TYPE=prometheus + - PROMETHEUS_SERVER_URL=http://prometheus:9090 + ports: + - "14250:14250" + - "16685:16685" # GRPC + - "16686:16686" # UI + networks: + - static-network + + prometheus: + image: prom/prometheus:latest + volumes: + - "./dependencies/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml" + ports: + - "9090:9090" + networks: + - static-network + + grafana: + image: grafana/grafana-oss + restart: unless-stopped + ports: + - "3000:3000" + networks: + - static-network + +networks: + static-network: +``` + +### Application example + +Example service mocking a call to a remote API: here the remote API returns apples or bananas. +We're using the metrics to measure the apple/banana ratio returned by the API, +and the traces to measure the latency of this API. + +```scala 3 +import cats.effect.Async +import cats.effect.std.Random +import cats.implicits.{catsSyntaxApply, toFlatMapOps, toFunctorOps} +import io.circe.derivation.{Configuration, ConfiguredCodec} +import org.typelevel.otel4s.Attribute +import org.typelevel.otel4s.metrics.Meter +import org.typelevel.otel4s.trace.Tracer + +import java.util.concurrent.TimeUnit +import scala.concurrent.duration.FiniteDuration + +given Configuration = Configuration.default +case class ApiData(result: String) derives ConfiguredCodec + +trait ExampleService[F[_]] { + def getDataFromSomeAPI: F[ApiData] +} + +object ExampleService { + def apply[F[_]: Async: Tracer: Meter: Random]( + minLatency: Int, + maxLatency: Int, + bananaPercentage: Int + ): F[ExampleService[F]] = { + val metricsProvider = summon[Meter[F]] + metricsProvider + .counter("RemoteApi.fruit.count") + .withDescription("Number of fruits returned by the API.") + .create + .map { remoteApiFruitCount => + new ExampleService[F] { + private val spanBuilder = Tracer[F].spanBuilder("remoteAPI.com/fruit").build + + override def getDataFromSomeAPI: F[ApiData] = for { + latency <- Random[F].betweenInt(minLatency, maxLatency) + isBanana <- Random[F].betweenInt(0, 100).map(_ <= bananaPercentage) + duration = FiniteDuration(latency, TimeUnit.MILLISECONDS) + fruit <- spanBuilder.surround( + Async[F].sleep(duration) *> + Async[F].pure(if isBanana then "banana" else "apple") + ) + _ <- remoteApiFruitCount.inc(Attribute("fruit", fruit)) + } yield ApiData(s"Api returned a $fruit !") + } + } + } +} +``` + +### Run the application + +@:select(build-tool) + +@:choice(sbt) + +```shell +$ sbt run +``` + +@:choice(scala-cli) + +```shell +$ scala-cli run grafana.scala +``` + +@:@ + +### Setup your metrics dashboard + +Connect to grafana and Add your Jaeger and Grafana data sources. Once done, you can create your [first dashboard](https://github.com/typelevel/otel4s/tree/main/docs/examples/grafana/dashboards/metrics-dashboard.json). +Now after making a few calls to `ExampleService.getDataFromSomeAPI`, you should get some data points: + +@:image(metrics-grafana.png) { + alt = Grafana Metrics Example +} + +### Adding your traces + +Just like you just did with Prometheus, you can use Jaeger as data source and display traces using the appropriate data visualization in your [new dashboard](https://github.com/typelevel/otel4s/tree/main/docs/examples/grafana/dashboards/traces-dashboard.json): + +@:image(traces-grafana.png) { +alt = Grafana Traces Example +} + +> Note: a complete example is available [here](https://github.com/keuhdall/otel4s-grafana-example/) \ No newline at end of file diff --git a/docs/examples/grafana/dashboards/metrics-dashboard.json b/docs/examples/grafana/dashboards/metrics-dashboard.json new file mode 100644 index 000000000..97b0ce2fa --- /dev/null +++ b/docs/examples/grafana/dashboards/metrics-dashboard.json @@ -0,0 +1,180 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.0.3" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 9, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "builder", + "expr": "RemoteApi_fruit_count{fruit=\"apple\"}", + "instant": false, + "legendFormat": "{{fruit}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "builder", + "expr": "RemoteApi_fruit_count{fruit=\"banana\"}", + "hide": false, + "instant": false, + "legendFormat": "{{fruit}}", + "range": true, + "refId": "B" + } + ], + "title": "Apple vs Banana ratio", + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Example Service", + "uid": "af24c6de-9837-4d15-b628-f576d4e4940e", + "version": 3, + "weekStart": "" +} \ No newline at end of file diff --git a/docs/examples/grafana/dashboards/traces-dashboard.json b/docs/examples/grafana/dashboards/traces-dashboard.json new file mode 100644 index 000000000..0ef0e8ca3 --- /dev/null +++ b/docs/examples/grafana/dashboards/traces-dashboard.json @@ -0,0 +1,119 @@ +{ + "__inputs": [ + { + "name": "DS_JAEGER", + "label": "Jaeger", + "description": "", + "type": "datasource", + "pluginId": "jaeger", + "pluginName": "Jaeger" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.0.3" + }, + { + "type": "datasource", + "id": "jaeger", + "name": "Jaeger", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "traces", + "name": "Traces", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "jaeger", + "uid": "${DS_JAEGER}" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "targets": [ + { + "datasource": { + "type": "jaeger", + "uid": "${DS_JAEGER}" + }, + "query": "${TraceId}", + "refId": "A" + } + ], + "title": "Example Traces Dashboard", + "type": "traces" + } + ], + "refresh": "", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "a825392fffcdc16aed677dfb2db7db89", + "value": "a825392fffcdc16aed677dfb2db7db89" + }, + "hide": 0, + "name": "TraceId", + "options": [ + { + "selected": true, + "text": "a825392fffcdc16aed677dfb2db7db89", + "value": "a825392fffcdc16aed677dfb2db7db89" + } + ], + "query": "a825392fffcdc16aed677dfb2db7db89", + "skipUrlSync": false, + "type": "textbox" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Traces", + "uid": "b6b5915c-16c4-4008-a6b2-2d5d3c1e6372", + "version": 4, + "weekStart": "" +} \ No newline at end of file diff --git a/docs/examples/grafana/metrics-grafana.png b/docs/examples/grafana/metrics-grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..4311f27530c7b79a060947aae469a427a48f4468 GIT binary patch literal 63164 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 Date: Sat, 9 Sep 2023 14:31:24 +0300 Subject: [PATCH 2/2] Grafana All-in-one, add more details: configuration notes, service configs --- docs/examples/grafana/README.md | 180 ++++++++++++++++++++++++-------- 1 file changed, 134 insertions(+), 46 deletions(-) diff --git a/docs/examples/grafana/README.md b/docs/examples/grafana/README.md index 770c1d1b2..94ad4e95a 100644 --- a/docs/examples/grafana/README.md +++ b/docs/examples/grafana/README.md @@ -1,7 +1,7 @@ # Grafana - All-in-one -In this example, we are going to use [Prometheus](https://prometheus.io/) and [Tempo](https://grafana.com/oss/tempo/), both displayed inside [Grafana](https://grafana.com/grafana/). -Just like [Jaeger example](../jaeger-docker/README.md), we will need to setup a collector to gather both metrics and traces. +In this example, we are going to use [Prometheus](https://prometheus.io/) and [Jaeger](https://jaegertracing.io/), both displayed inside [Grafana](https://grafana.com/grafana/). +Just like [Jaeger example](../jaeger-docker/README.md), we will need to set up an [Open Telemetry Collector](https://opentelemetry.io/docs/collector/) to gather both metrics and traces. ### Project setup @@ -19,8 +19,9 @@ libraryDependencies ++= Seq( "io.opentelemetry" % "opentelemetry-sdk-extension-autoconfigure" % "@OPEN_TELEMETRY_VERSION@" % Runtime // <3> ) run / fork := true -javaOptions += "-Dotel.java.global-autoconfigure.enabled=true" // <4> -javaOptions += "-Dotel.service.name=grafana-example" // <5> +javaOptions += "-Dotel.java.global-autoconfigure.enabled=true" // <4> +javaOptions += "-Dotel.service.name=grafana-example" // <5> +javaOptions += "-Dotel.exporter.otlp.endpoint=http://localhost:4317" // <6> ``` @:choice(scala-cli) @@ -31,17 +32,19 @@ Add directives to the `grafana.scala`: //> using lib "org.typelevel::otel4s-java:@VERSION@" // <1> //> using lib "io.opentelemetry:opentelemetry-exporter-otlp:@OPEN_TELEMETRY_VERSION@" // <2> //> using lib "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:@OPEN_TELEMETRY_VERSION@" // <3> -//> using `java-opt` "-Dotel.java.global-autoconfigure.enabled=true" // <4> -//> using `java-opt` "-Dotel.service.name=grafana-example" // <5> +//> using `java-opt` "-Dotel.java.global-autoconfigure.enabled=true" // <4> +//> using `java-opt` "-Dotel.service.name=grafana-example" // <5> +//> using `java-opt` "-Dotel.exporter.otlp.endpoint=http://localhost:4317" // <6> ``` @:@ -1) Add the `otel4s` library -2) Add an OpenTelemetry exporter. Without the exporter, the application will crash -3) Add an OpenTelemetry autoconfigure extension -4) Enable OpenTelemetry SDK autoconfigure mode -5) Add the name of the application to use in the traces +1) Add the `otel4s` library +2) Add an OpenTelemetry exporter. Without the exporter, the application will crash +3) Add an OpenTelemetry autoconfigure extension +4) Enable OpenTelemetry SDK autoconfigure mode +5) Add the name of the application to use in the traces +6) Add the OpenTelemetry Collector endpoint ### OpenTelemetry SDK configuration @@ -59,21 +62,11 @@ Use the following `docker-compose.yaml` file: ```yaml version: '3.7' services: - otel4s-grafana-example: - image: otel4s-grafana-example:0.1.0-SNAPSHOT - environment: - OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317" - restart: on-failure - ports: - - "8080:8080" - networks: - - static-network - - otel-collector: + otel-collector: # receives application metrics and traces via gRPC or HTTP protocol image: otel/opentelemetry-collector-contrib command: [--config=/etc/otel-collector-config.yaml] volumes: - - ./dependencies/opentelemetry/otel-collector-config.yaml:/etc/otel-collector-config.yaml + - "./config/otel-collector-config.yaml:/etc/otel-collector-config.yaml" ports: - "8888:8888" # Prometheus metrics exposed by the collector - "8889:8889" # Prometheus exporter metrics @@ -82,10 +75,10 @@ services: networks: - static-network - jaeger: + jaeger: # stores traces received from the OpenTelemetry Collector image: jaegertracing/all-in-one:latest volumes: - - "./dependencies/jaeger/jaeger-ui.json:/etc/jaeger/jaeger-ui.json" + - "./config/jaeger-ui.json:/etc/jaeger/jaeger-ui.json" command: --query.ui-config /etc/jaeger/jaeger-ui.json environment: - METRICS_STORAGE_TYPE=prometheus @@ -97,16 +90,16 @@ services: networks: - static-network - prometheus: + prometheus: # scrapes metrics from the OpenTelemetry Collector image: prom/prometheus:latest volumes: - - "./dependencies/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml" + - "./config/prometheus.yml:/etc/prometheus/prometheus.yml" ports: - "9090:9090" networks: - static-network - grafana: + grafana: # queries Jaeger and Prometheus to visualize traces and metrics image: grafana/grafana-oss restart: unless-stopped ports: @@ -118,59 +111,154 @@ networks: static-network: ``` +### Configuration files + +#### ./config/otel-collector-config.yaml + +OpenTelemetry Collector configuration: receivers, exporters, and processing pipelines. + +```yml +receivers: + otlp: + protocols: # enable OpenTelemetry Protocol receiver, both gRPC and HTTP + grpc: + http: + +exporters: + jaeger: # export received traces to Jaeger + endpoint: jaeger:14250 + tls: + insecure: true + + prometheus: # run Prometheus exporter server on port 8889, so Prometheus can scrape the metrics + endpoint: 0.0.0.0:8889 + send_timestamps: true + +processors: + batch: + timeout: 10s + +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [jaeger] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [prometheus] +``` + +#### ./config/prometheus.yml + +Prometheus server configuration: scrape interval and targets. + +```yml +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: "prometheus" # scrape prometheus itself to collect the internal metrics (e.g. scrape stats, etc) + static_configs: + - targets: ["localhost:9090"] + + - job_name: "otel-collector" # scrape metrics from the OpenTelemetry collector + static_configs: + - targets: ["otel-collector:8889"] +``` + +#### ./config/jaeger-ui.json + +Jaeger configuration: enable [Service Performance Monitor (SPM)](https://www.jaegertracing.io/docs/1.48/spm/). + +```json +{ + "monitor": { + "menuEnabled": true + }, + "dependencies": { + "menuEnabled": true + } +} +``` + ### Application example Example service mocking a call to a remote API: here the remote API returns apples or bananas. We're using the metrics to measure the apple/banana ratio returned by the API, and the traces to measure the latency of this API. -```scala 3 -import cats.effect.Async +```scala mdoc:silent +import cats.effect.{Async, IO, IOApp} import cats.effect.std.Random -import cats.implicits.{catsSyntaxApply, toFlatMapOps, toFunctorOps} -import io.circe.derivation.{Configuration, ConfiguredCodec} +import cats.syntax.apply._ +import cats.syntax.flatMap._ +import cats.syntax.functor._ import org.typelevel.otel4s.Attribute +import org.typelevel.otel4s.java.OtelJava import org.typelevel.otel4s.metrics.Meter import org.typelevel.otel4s.trace.Tracer import java.util.concurrent.TimeUnit import scala.concurrent.duration.FiniteDuration -given Configuration = Configuration.default -case class ApiData(result: String) derives ConfiguredCodec +case class ApiData(result: String) -trait ExampleService[F[_]] { +trait ApiService[F[_]] { def getDataFromSomeAPI: F[ApiData] } -object ExampleService { +object ApiService { def apply[F[_]: Async: Tracer: Meter: Random]( minLatency: Int, maxLatency: Int, bananaPercentage: Int - ): F[ExampleService[F]] = { - val metricsProvider = summon[Meter[F]] - metricsProvider + ): F[ApiService[F]] = + Meter[F] .counter("RemoteApi.fruit.count") .withDescription("Number of fruits returned by the API.") .create .map { remoteApiFruitCount => - new ExampleService[F] { - private val spanBuilder = Tracer[F].spanBuilder("remoteAPI.com/fruit").build - + new ApiService[F] { override def getDataFromSomeAPI: F[ApiData] = for { latency <- Random[F].betweenInt(minLatency, maxLatency) isBanana <- Random[F].betweenInt(0, 100).map(_ <= bananaPercentage) duration = FiniteDuration(latency, TimeUnit.MILLISECONDS) - fruit <- spanBuilder.surround( + fruit <- Tracer[F].span("remoteAPI.com/fruit").surround( Async[F].sleep(duration) *> - Async[F].pure(if isBanana then "banana" else "apple") + Async[F].pure(if (isBanana) "banana" else "apple") ) _ <- remoteApiFruitCount.inc(Attribute("fruit", fruit)) } yield ApiData(s"Api returned a $fruit !") } } - } +} + +object ExampleService extends IOApp.Simple { + def run: IO[Unit] = + OtelJava.global.flatMap { otel4s => + ( + otel4s.tracerProvider.get("com.service.runtime"), + otel4s.meterProvider.get("com.service.runtime"), + Random.scalaUtilRandom[IO] + ).flatMapN { case components => + implicit val (tracer: Tracer[IO], meter: Meter[IO], random: Random[IO]) = + components + + for { + service <- ApiService[IO]( + minLatency = 40, + maxLatency = 80, + bananaPercentage = 70 + ) + data <- service.getDataFromSomeAPI + _ <- IO.println(s"Service data: $data") + } yield () + } + } } ``` @@ -195,7 +283,7 @@ $ scala-cli run grafana.scala ### Setup your metrics dashboard Connect to grafana and Add your Jaeger and Grafana data sources. Once done, you can create your [first dashboard](https://github.com/typelevel/otel4s/tree/main/docs/examples/grafana/dashboards/metrics-dashboard.json). -Now after making a few calls to `ExampleService.getDataFromSomeAPI`, you should get some data points: +Now after making a few calls to `ApiService.getDataFromSomeAPI`, you should get some data points: @:image(metrics-grafana.png) { alt = Grafana Metrics Example