Hoppa till innehållet
Kom igång
Bygg med

Två vägar in, och båda är standard

JavaScript och TypeScript har vår egen klient. Alla andra språk går in via OpenTelemetry, alltså med standardens egna bibliotek och inte med något vi har skrivit. Det betyder att instrumenteringen ni gör i dag fungerar mot vilken mottagare som helst, också mot någon annans.

7Avsnitt med kod på den här sidanEtt per språk
0Agenter att installera på maskinenOTLP går in direkt
0 krIngår i planen Fri, 500 000 händelser i månadenPriser ur @gaddr/pricing
Instrumenteringen ni gör i dag fungerar mot vilken mottagare som helst.
OpenTelemetry

OTLP in, utan egen agent

Skickar era tjänster redan OTLP är hela arbetet två miljövariabler. Ingen agent installeras på maskinen, ingen sidovagn körs bredvid tjänsten, och ingen kod byts ut.

  • Samma inmatning tar emot spår, loggar och mätvärden. En adress, inte tre.
  • Protokollet är http/protobuf. Biblioteket lägger på sökvägen per signal, alltså v1/traces, v1/logs eller v1/metrics.
  • Nyckeln går i huvudet x-gaddr-key. Den är publik och skriver bara.
  • Kör ni redan en OpenTelemetry Collector pekar ni om dess exportör och rör inte tjänsterna alls.

OpenTelemetry in, utan egen agent, står i planen Fri i packages/pricing/src/index.ts. Adressen och nyckeln står i projektets inställningar.

.envMiljövariabler
OTEL_EXPORTER_OTLP_ENDPOINT="https://log.gaddr.com/api/otlp"
OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
OTEL_EXPORTER_OTLP_HEADERS="x-gaddr-key=gdr_pk_din_nyckel"
OTEL_SERVICE_NAME="kassa-api"
OTEL_RESOURCE_ATTRIBUTES="deployment.environment=production,service.version=2026.8.15"

service.version fyller samma roll som release i vår egen klient. Sätt den till samma sträng som bygget bär, så kopplas felet till commiten som byggde det.

NODEPYGOJVMOTLP4317 grpcGADDR LOGINGEN EGEN AGENTSAMMA ÄNDPUNKT
  • En adress tar emot spår, loggar och mätvärden.
  • Ingen agent på maskinen och ingen sidovagn bredvid tjänsten.
Webb, Node, Deno och Bun

JavaScript och TypeScript

Det enda språket med vår egen klient. Paketet väger lite, kastar aldrig vidare in i er kod, och bär taket och maskningen inbyggda. install kopplar in fönstrets felhanterare och avvisade löften, och returnerar en funktion som kopplar loss dem igen.

  • Samma paket i webbläsaren och på servern.
  • Nyckeln är publik och får ligga i klientbygget.
  • Kör ni redan OpenTelemetry i Node behöver ni inte paketet alls.
app/entry.client.tsxTypeScript
1import { initTelemetry } from "@gaddr/telemetry";
2
3const log = initTelemetry({
4  ingestKey: "gdr_pk_din_nyckel",
5  environment: "production",
6  release: "web@2026.8.15",
7});
8
9log.install();

Tre rader. install kopplar in error, unhandledrejection och en tömning när fliken göms. Hela vägen står i kom igång.

Webb, Node, Deno och Bun
Django, FastAPI och Flask

Python

Den automatiska instrumenteringen känner igen ramverket och webbserverns anrop utan att ni skriver någon kod. Kör tjänsten med opentelemetry-instrument, sätt två miljövariabler, och spåren landar i samma vy som fel och loggar.

  • opentelemetry-bootstrap installerar instrumenteringen för de paket ni redan har.
  • Django, FastAPI och Flask känns igen utan konfiguration.
  • Loggar och mätvärden går samma väg som spåren, med samma två variabler.
terminalPython
1pip install opentelemetry-distro opentelemetry-exporter-otlp
2opentelemetry-bootstrap --action=install
3
4export OTEL_EXPORTER_OTLP_ENDPOINT="https://log.gaddr.com/api/otlp"
5export OTEL_EXPORTER_OTLP_HEADERS="x-gaddr-key=gdr_pk_din_nyckel"
6export OTEL_SERVICE_NAME="kassa-api"
7
8opentelemetry-instrument python manage.py runserver

Adressen och nyckeln står i projektets inställningar. OTEL_SERVICE_NAME är det namn tjänsten får i vyn, så sätt det till något ni känner igen klockan tre på natten.

Django, FastAPI och Flask
net/http och slog

Go

Go instrumenteras i koden och inte med en agent. Exportören går över HTTP, leverantören sätts en gång i main, och otelhttp lägger sig runt er befintliga hanterare utan att ni skriver om den.

  • otelhttp.NewHandler tar den hanterare ni redan har.
  • slog kopplas till spåret, så att loggraden bär samma spår-id.
  • Avstängningen töms i en defer, så att det sista som hände hinner ut.
main.goGo
1exp, err := otlptracehttp.New(ctx,
2  otlptracehttp.WithEndpointURL("https://log.gaddr.com/api/otlp/v1/traces"),
3  otlptracehttp.WithHeaders(map[string]string{"x-gaddr-key": nyckel}),
4)
5
6tp := trace.NewTracerProvider(trace.WithBatcher(exp))
7otel.SetTracerProvider(tp)
8defer tp.Shutdown(ctx)
9
10http.Handle("/", otelhttp.NewHandler(mux, "http"))

WithBatcher buntar spåren på samma sätt som vår egen klient buntar händelser. Ett anrop per bunt i stället för ett per span är skillnaden mellan en mätbar kostnad och en osynlig.

net/http och slog
tracing och axum

Rust

Rust går in genom tracing, som ni troligen redan använder. Lagret från tracing-opentelemetry skickar vidare det ni redan skriver, alltså behöver ni inte byta makro i koden för att få spår.

  • tracing::info och tracing::error blir händelser utan att skrivas om.
  • axum instrumenteras med ett lager, inte med en ändring per rutt.
  • Exporten är buntad, och den töms vid avstängning.
src/main.rsRust
1let exporter = opentelemetry_otlp::SpanExporter::builder()
2    .with_http()
3    .with_endpoint("https://log.gaddr.com/api/otlp/v1/traces")
4    .with_headers(HashMap::from([("x-gaddr-key".into(), nyckel)]))
5    .build()?;
6
7let provider = SdkTracerProvider::builder()
8    .with_batch_exporter(exporter)
9    .build();
10
11tracing_subscriber::registry()
12    .with(OpenTelemetryLayer::new(provider.tracer("api")))
13    .init();

Registret från tracing_subscriber är det enda stället som ändras. Resten av koden fortsätter använda tracing precis som förut.

tracing och axum
Laravel och Symfony

PHP

PHP instrumenteras med en tillägsmodul och ett paket via Composer. Den automatiska instrumenteringen känner igen Laravel och Symfony, och anropen mot databasen och kön kommer med utan att ni rör en controller.

  • Modulen laddas i php.ini, paketen installeras med Composer.
  • Laravels köer och Symfonys meddelandebuss instrumenteras utan kod.
  • Konfigurationen ligger i miljövariabler, alltså per miljö och inte i koden.
terminalPHP
1pecl install opentelemetry
2composer require open-telemetry/sdk open-telemetry/exporter-otlp
3
4OTEL_PHP_AUTOLOAD_ENABLED="true"
5OTEL_TRACES_EXPORTER="otlp"
6OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
7OTEL_EXPORTER_OTLP_ENDPOINT="https://log.gaddr.com/api/otlp"
8OTEL_EXPORTER_OTLP_HEADERS="x-gaddr-key=gdr_pk_din_nyckel"
9OTEL_SERVICE_NAME="butik-web"

Raderna nedanför composer är miljövariabler och hör hemma i er miljöfil, inte i koden. Med autoload påslaget behöver ni inte anropa något själva för att få de vanliga ramverken instrumenterade.

Laravel och Symfony
Spring och Micronaut

Java

Java behöver inte en enda rad ny kod. Agenten hängs på vid start, känner igen Spring, Micronaut, JDBC, Kafka och de flesta klienter ni redan använder, och skickar vidare över OTLP.

  • En jar-fil på kommandoraden, ingen ändring i bygget.
  • Spring Boot och Micronaut känns igen utan konfiguration.
  • Samma agent skickar spår, mätvärden och loggar.
terminalJava
1java -javaagent:opentelemetry-javaagent.jar \
2  -Dotel.service.name=order-service \
3  -Dotel.exporter.otlp.endpoint=https://log.gaddr.com/api/otlp \
4  -Dotel.exporter.otlp.headers=x-gaddr-key=gdr_pk_din_nyckel \
5  -Dotel.exporter.otlp.protocol=http/protobuf \
6  -jar order-service.jar

Agenten laddas före er kod och instrumenterar biblioteken när de laddas. Vill ni lägga till egna spann gör ni det med annoteringen WithSpan, men ni behöver inte göra det för att komma i gång.

Spring och Micronaut
Krascher och sessioner

iOS och Android

Mobilt går in med OpenTelemetrys egna bibliotek för Swift och för Android. Kraschen, nätverksanropen och skärmbytena blir händelser i samma vy som webben och api:t, och de knyts ihop av spår-id:t när det följer med anropet.

  • Swift-paketet läggs till med Swift Package Manager.
  • Android-paketet läggs till med Gradle och startas i Application.
  • Ett anrop från appen till ert api hamnar i samma spår som serverns steg.
AppDelegate.swiftSwift
1let exporter = OtlpHttpTraceExporter(
2  endpoint: URL(string: "https://log.gaddr.com/api/otlp/v1/traces")!,
3  config: OtlpConfiguration(headers: [("x-gaddr-key", nyckel)])
4)
5
6OpenTelemetry.registerTracerProvider(
7  tracerProvider: TracerProviderBuilder()
8    .add(spanProcessor: BatchSpanProcessor(spanExporter: exporter))
9    .build()
10)

På Android är motsvarigheten OtlpHttpSpanExporter med samma adress och samma huvud, satt en gång i er Application-klass.

Krascher och sessioner
HÅRT TAKUTAN TAKTAKOVERAGE0OVERAGE1281 94012 400
  • Samma tak gäller oavsett vilket bibliotek som skickade.
  • Kvoten nollställs vid månadsskiftet utan att ni gör något.
Oavsett språk

Taket sitter i projektet, inte i biblioteket

Vår egen klient bär taket i koden som skickar. Skickar ni OTLP från ett annat språk sitter samma tak i projektet i stället, alltså på mottagningssidan.

  • Volym över kvoten tas inte emot, och det som inte tas emot faktureras inte.
  • Inmatningen svarar GDR-LOG-0500 när kvoten är förbrukad, oavsett vilket bibliotek som skickade.
  • Höjningen är ett aktivt val ni gör i projektet, aldrig en automatisk uppgradering.
  • Kvoten nollställs vid månadsskiftet utan att ni gör någonting.
Frågor

Det ni undrar om vägen in

Ni betalar för volymen som kommer in, inte för antalet språk.

Vanliga frågor

Måste vi använda ert bibliotek?

Nej, utom i webbläsaren där vår klient är det enklaste. Allt annat går in via OpenTelemetry, och den instrumenteringen är inte vår. Den fungerar mot vilken mottagare som helst, alltså kan ni byta från oss utan att röra koden.

Behöver vi installera en agent på servern?

Nej. OTLP går direkt från tjänsten till oss. Kör ni redan en OpenTelemetry Collector fungerar den precis som förut, ni pekar bara om dess exportör.

Vilket protokoll ska vi välja?

http/protobuf. Det går genom brandväggar och lastbalanserare som vilken HTTPS-trafik som helst, och det är standardvärdet i de flesta bibliotek.

Kan ett anrop från appen hamna i samma spår som serverns steg?

Ja. Spår-id:t följer med anropet, och stegen på båda sidor hamnar i samma träd. Det är det som gör att en långsam skärm i appen går att spåra till en väntande databaspool.

Var får vi tag på adressen och nyckeln?

I projektets inställningar. Nyckeln börjar på gdr_pk_, är publik, och går att återkalla och byta ut när ni vill.

Vad kostar det att skicka från fler språk?

Ingenting extra. Ni betalar för volymen som kommer in, inte för antalet tjänster, antalet språk eller antalet personer som läser. Planen Fri kostar 0 kr, och prissidan har hela listan.

Skicka första händelsen i kväll

Kom igång tar er från installation till första felet i vyn, med maskningen redan på och taket redan satt.

Maskningen är redan på och taket är redan satt.