Instrumentation for https://opentelemetry.io
Find a file
Shon Feder c30f3b1c0c
Fix possible data races in eio test bin
Since this test runs with multiple domains, we cannot mutate plain refs
as we were without inviting data races.
2025-09-07 23:24:00 -04:00
.github add install workflow test 2025-07-31 14:36:17 -07:00
src Update src/core/opentelemetry.ml 2025-09-02 15:08:22 -04:00
tests Fix possible data races in eio test bin 2025-09-07 23:24:00 -04:00
vendor chore: migrate to OTEL proto files 1.0 2023-09-06 23:27:31 -04:00
.gitignore gitignore 2025-03-19 21:05:13 -04:00
.gitmodules detail 2023-03-09 10:47:15 -05:00
.ocamlformat chore: bump ocamlforamt to 0.27 2025-04-17 10:03:26 -04:00
.ocamlformat-ignore ocamlformat-ignore 2022-08-15 12:30:16 -04:00
CHANGES.md prepare for 0.11.2 2025-03-27 09:29:36 -04:00
dune format 2024-09-20 09:22:13 -04:00
dune-project feat: add Logs integration 2025-07-31 14:25:52 -07:00
emit1.sh feat: parse W3C traceparent header 2022-03-24 17:22:45 +00:00
Makefile format 2024-09-20 09:22:13 -04:00
opentelemetry-client-cohttp-eio.opam Fix eio_main dep 2025-07-14 15:09:04 -04:00
opentelemetry-client-cohttp-lwt.opam Use containers in tests 2025-07-10 16:11:20 -04:00
opentelemetry-client-ocurl.opam prepare for 0.11.2 2025-03-27 09:29:36 -04:00
opentelemetry-cohttp-lwt.opam Remove unneeded dependency 2025-07-08 21:33:08 -04:00
opentelemetry-logs.opam feat: add Logs integration 2025-07-31 14:25:52 -07:00
opentelemetry-lwt.opam prepare for 0.11.2 2025-03-27 09:29:36 -04:00
opentelemetry.opam feat: adapt to trace 0.10 2025-04-17 10:04:16 -04:00
README.md readme 2025-04-10 15:36:06 -04:00

Opentelemetry build

This project provides an API for instrumenting server software using opentelemetry, as well as connectors to talk to opentelemetry software such as jaeger.

  • library opentelemetry should be used to instrument your code and possibly libraries. It doesn't communicate with anything except a backend (default: dummy backend);
  • library opentelemetry-client-ocurl is a backend that communicates via http+protobuf with some collector (otelcol, datadog-agent, etc.) using cURL bindings;
  • library opentelemetry-client-cohttp-lwt is a backend that communicates via http+protobuf with some collector using cohttp.

License

MIT

Features

  • basic traces
  • basic metrics
  • basic logs
  • nice API
  • interface with lwt
  • sync collector relying on ocurl
    • batching, perf, etc.
  • async collector relying on ocurl-multi
  • interface with logs (carry context around)
  • implicit scope (via vendored ambient-context, see opentelemetry.ambient-context)

Use

For now, instrument traces/spans, logs, and metrics manually:

module Otel = Opentelemetry
let (let@) = (@@)

let foo () =
  let@ scope = Otel.Trace.with_  "foo"
      ~attrs:["hello", `String "world"] in
  do_work();
  Otel.Metrics.(
    emit [
      gauge ~name:"foo.x" [int 42];
    ]);
  do_more_work();
  ()

Setup

If you're writing a top-level application, you need to perform some initial configuration.

  1. Set the service_name;
  2. optionally configure [ambient-context][] with the appropriate storage for your environment — TLS, Lwt, Eio…;
  3. and install a Collector (usually by calling your collector's with_setup function.)

For example, if your application is using Lwt, and you're using ocurl as your collector, you might do something like this:

let main () =
  Otel.Globals.service_name := "my_service";
  Otel.GC_metrics.basic_setup();

  Opentelemetry_ambient_context.set_storage_provider (Opentelemetry_ambient_context_lwt.storage ());
  Opentelemetry_client_ocurl.with_setup () @@ fun () ->
  (* … *)
  foo ();
  (* … *)

[ambient-context]: now vendored as opentelemetry.ambient-context, formerly https://v3.ocaml.org/p/ambient-context

Configuration

The library is configurable via Opentelemetry.Config, via the standard opentelemetry env variables, or with some custom environment variables.

  • OTEL_EXPORTER_OTLP_ENDPOINT sets the http endpoint to send signals to
  • OTEL_OCAML_DEBUG=1 to print some debug messages from the opentelemetry library ide
  • OTEL_RESOURCE_ATTRIBUTES sets a comma separated list of custom resource attributes

Collector opentelemetry-client-ocurl

This is a synchronous collector that uses the http+protobuf format to send signals (metrics, traces, logs) to some other collector (eg. otelcol or the datadog agent).

Do note that this backend uses a thread pool and is incompatible with uses of fork on some Unixy systems. See #68 for a possible workaround.

Collector opentelemetry-client-cohttp-lwt

This is a Lwt-friendly collector that uses cohttp to send signals to some other collector (e.g. otelcol). It must be run inside a Lwt_main.run scope.

Opentelemetry-trace

The optional library opentelemetry.trace, present if trace is installed, provides a collector for trace. This collector forwards and translates events from trace into opentelemetry. It's only useful if there also is also a OTEL collector.

License

MIT

Semantic Conventions

Not supported yet.