Instrumentation for https://opentelemetry.io
59
stars
917
commits
OCaml
primary language
Jun 10, 2026
updated
This project provides an API for instrumenting server software using opentelemetry, as well as connectors to talk to opentelemetry software such as jaeger.
opentelemetry should be used to instrument your code
and possibly libraries. It doesn't communicate with anything except
an exporter (default: no-op);opentelemetry-client-ocurl is an exporter that communicates
via http+protobuf with some collector (otelcol, datadog-agent, etc.) using cURL bindings;opentelemetry-client-cohttp-lwt is an exporter that communicates
via http+protobuf with some collector using cohttp.MIT
lwtlogs (carry context around)ambient-context, see opentelemetry.ambient-context)For now, instrument traces/spans, logs, and metrics manually:
module Otel = Opentelemetry
let (let@) = (@@)
let foo () =
let@ span = Otel.Tracer.with_ "foo"
~attrs:["hello", `String "world"] in
do_work ();
let now = Otel.Clock.now Otel.Meter.default.clock in
Otel.Meter.emit1 Otel.Meter.default
Otel.Metrics.(gauge ~name:"foo.x" [int ~now 42]);
Otel.Span.add_event span (Otel.Event.make "work done");
do_more_work ();
()
If you're writing a top-level application, you need to perform some initial configuration.
service_name;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.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
see doc/migration_guide_v0.90.md
The library supports standard OpenTelemetry environment variables:
General:
OTEL_SDK_DISABLED - disable the SDK (default: false)OTEL_SERVICE_NAME - service nameOTEL_RESOURCE_ATTRIBUTES - comma-separated key=value resource attributesOTEL_OCAML_DEBUG=1 - print debug messages from the opentelemetry libraryExporter endpoints:
OTEL_EXPORTER_OTLP_ENDPOINT - base endpoint (default: http://localhost:4318)OTEL_EXPORTER_OTLP_TRACES_ENDPOINT - traces endpointOTEL_EXPORTER_OTLP_METRICS_ENDPOINT - metrics endpointOTEL_EXPORTER_OTLP_LOGS_ENDPOINT - logs endpointExporter configuration:
OTEL_EXPORTER_OTLP_PROTOCOL - protocol: http/protobuf or http/json (default: http/protobuf)Headers:
OTEL_EXPORTER_OTLP_HEADERS - headers as comma-separated key=value pairsOTEL_EXPORTER_OTLP_TRACES_HEADERS - traces-specific headersOTEL_EXPORTER_OTLP_METRICS_HEADERS - metrics-specific headersOTEL_EXPORTER_OTLP_LOGS_HEADERS - logs-specific headersThis is a synchronous exporter that uses the http+protobuf format
to send signals (metrics, traces, logs) to some collector (eg. otelcol
or the datadog agent).
Do note that it uses a thread pool and is incompatible
with uses of fork on some Unixy systems.
See #68 for a possible workaround.
This is a Lwt-friendly exporter that uses cohttp to send
signals to some collector (e.g. otelcol). It must be run
inside a Lwt_main.run scope.
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.
MIT
Not supported yet.
OCaml
99.0%
Instrumentation for https://opentelemetry.io
59
stars
917
commits
OCaml
primary language
Jun 10, 2026
updated
This project provides an API for instrumenting server software using opentelemetry, as well as connectors to talk to opentelemetry software such as jaeger.
opentelemetry should be used to instrument your code
and possibly libraries. It doesn't communicate with anything except
an exporter (default: no-op);opentelemetry-client-ocurl is an exporter that communicates
via http+protobuf with some collector (otelcol, datadog-agent, etc.) using cURL bindings;opentelemetry-client-cohttp-lwt is an exporter that communicates
via http+protobuf with some collector using cohttp.MIT
lwtlogs (carry context around)ambient-context, see opentelemetry.ambient-context)For now, instrument traces/spans, logs, and metrics manually:
module Otel = Opentelemetry
let (let@) = (@@)
let foo () =
let@ span = Otel.Tracer.with_ "foo"
~attrs:["hello", `String "world"] in
do_work ();
let now = Otel.Clock.now Otel.Meter.default.clock in
Otel.Meter.emit1 Otel.Meter.default
Otel.Metrics.(gauge ~name:"foo.x" [int ~now 42]);
Otel.Span.add_event span (Otel.Event.make "work done");
do_more_work ();
()
If you're writing a top-level application, you need to perform some initial configuration.
service_name;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.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
see doc/migration_guide_v0.90.md
The library supports standard OpenTelemetry environment variables:
General:
OTEL_SDK_DISABLED - disable the SDK (default: false)OTEL_SERVICE_NAME - service nameOTEL_RESOURCE_ATTRIBUTES - comma-separated key=value resource attributesOTEL_OCAML_DEBUG=1 - print debug messages from the opentelemetry libraryExporter endpoints:
OTEL_EXPORTER_OTLP_ENDPOINT - base endpoint (default: http://localhost:4318)OTEL_EXPORTER_OTLP_TRACES_ENDPOINT - traces endpointOTEL_EXPORTER_OTLP_METRICS_ENDPOINT - metrics endpointOTEL_EXPORTER_OTLP_LOGS_ENDPOINT - logs endpointExporter configuration:
OTEL_EXPORTER_OTLP_PROTOCOL - protocol: http/protobuf or http/json (default: http/protobuf)Headers:
OTEL_EXPORTER_OTLP_HEADERS - headers as comma-separated key=value pairsOTEL_EXPORTER_OTLP_TRACES_HEADERS - traces-specific headersOTEL_EXPORTER_OTLP_METRICS_HEADERS - metrics-specific headersOTEL_EXPORTER_OTLP_LOGS_HEADERS - logs-specific headersThis is a synchronous exporter that uses the http+protobuf format
to send signals (metrics, traces, logs) to some collector (eg. otelcol
or the datadog agent).
Do note that it uses a thread pool and is incompatible
with uses of fork on some Unixy systems.
See #68 for a possible workaround.
This is a Lwt-friendly exporter that uses cohttp to send
signals to some collector (e.g. otelcol). It must be run
inside a Lwt_main.run scope.
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.
MIT
Not supported yet.
OCaml
99.0%