Hoppa till innehåll
Kontinuerlig profilering

Kontinuerlig profilering

Visa som Markdown

Kontinuerlig profilering visar vad din applikation lägger CPU-tid och minne på, funktion för funktion. Status200 erbjuder ett Pyroscope-kompatibelt intags-API, så allt som kan skicka till en Pyroscope-server (eBPF-profileraren i Grafana Alloy eller ett Pyroscope-SDK för ditt språk) kan skicka till Status200, och du läser resultatet som flamdiagram bredvid dina loggar, mätvärden och spår.

Så fungerar det

En profilerare tar stickprov på dina processer och laddar upp en profil med några sekunders mellanrum till Status200s slutpunkt /pyroscope, med din intagningsnyckel. Status200 lagrar varje profil under tjänsten den nämner och ritar den som ett flamdiagram under Prestandaprofiler.

flowchart TB subgraph profilers["Profilerare"] direction LR alloy["Grafana Alloy (eBPF)"] sdk["Pyroscope-SDK<br/>i din app"] end alloy -->|"push-API"| endpoint["Status200 /pyroscope"] sdk -->|"ingest- eller push-API"| endpoint endpoint --> profiles["Prestandaprofiler"] profiles -.->|"trace- och span-ID:n"| traces["Länkade spår"]

Så når profiler Status200

Innan du börjar

Du behöver en intagningsnyckel för telemetri av typen Server. Om du inte har någon ännu:

  1. Öppna intagningsnycklarna

    Gå till Produkter → Projektinställningar, öppna Telemetri och APM i sidomenyn och välj Intagningsnycklar.

    Sidan med intagningsnycklar för telemetri i projektinställningarna

  2. Skapa en nyckel

    Klicka på Skapa ingestion-nyckel. Dialogrutan har redan nyckelns namn ifyllt och Server valt (den sorts nyckel som en applikation eller en collector skickar med), så klicka på Skapa ingestion-nyckel för att skapa den, eller byt namn på den först.

  3. Kopiera hemligheten

    Den nya nyckeln öppnas på en egen sida. Kopiera dess Hemlig nyckel: det är intagstoken som exemplen nedan kallar YOUR_STATUS200_INGESTION_TOKEN.

    Sidan för en intagningsnyckel för telemetri med dess hemliga nyckel

Intagsslutpunkt

InställningVärde
Bas-URL (Pyroscope-serverns adress)https://status200.ru/pyroscope
Autentiseringshuvudx-status200-token: YOUR_STATUS200_INGESTION_TOKEN

Klienter lägger till sin egen sökväg efter bas-URL:en (/ingest för de flesta Pyroscope-SDK:er, /push.v1.PusherService/Push för Grafana Alloy och .NET-SDK:t från v0.14), så du konfigurerar alltid bara bas-URL:en, utan avslutande snedstreck.

Status200 läser intagstoken från vilket som helst av dessa; använd det som din klient stöder:

MetodNär du använder den
Huvudet x-status200-tokenKlienter som låter dig lägga till egna huvuden.
Authorization: Bearer <token>SDK:er med ett alternativ authToken / auth_token: det är det de skickar.
HTTP Basic-autentisering, med token som lösenord (valfritt användarnamn)Klienter som bara erbjuder användare och lösenord för Basic-autentisering.
Obs

Driver du Status200 själv? Ersätt https://status200.ru med din egen värd, till exempel https://YOUR-ONEUPTIME-HOST/pyroscope.

Profilformat som stöds

FormatSkickas avStöds
pprof (binär protobuf, eventuellt gzip-komprimerad)Pyroscope-SDK:er för Go, Node.js och .NET; Grafana AlloyJa
Folded / collapsed textPyroscope-SDK:er för Python, Ruby och Rust (deras standardformat för uppladdning)Ja
JFR (Java Flight Recorder)Pyroscopes Java-agentInte ännu: använd Grafana Alloy för Java-tjänster

Skicka profiler

Grafana Alloy profilerar varje process på en värd utan kodändringar och är det rekommenderade sättet att börja. Ett Pyroscope-SDK körs i stället inne i din applikation.

Grafana Alloy

Grafana Alloy samlar med eBPF in CPU-profiler från varje process på en Linux-värd: ingen agent i din applikation och inga kodändringar. Det fungerar för Go, Rust, C/C++, Java, Python, Ruby, PHP, Node.js och .NET.

Skapa Alloy-konfigurationen:

alloy-config.alloyHCL
discovery.process "all" {
  refresh_interval = "60s"
}

discovery.relabel "alloy_profiles" {
  targets = discovery.process.all.targets

  rule {
    action       = "replace"
    source_labels = ["__meta_process_exe"]
    target_label  = "service_name"
  }
}

pyroscope.ebpf "default" {
  targets    = discovery.relabel.alloy_profiles.output
  forward_to = [pyroscope.write.status200.receiver]

  collect_interval = "15s"
  sample_rate      = 97
}

pyroscope.write "oneuptime" {
  endpoint {
    url = "https://status200.ru/pyroscope"
    headers = {
      "x-status200-token" = "YOUR_STATUS200_INGESTION_TOKEN",
    }
  }
}

Kör det med Docker. eBPF kräver en privilegierad container med värdens PID-namnområde:

docker-compose.ymlYAML
services:
  alloy:
    image: grafana/alloy:latest
    privileged: true
    pid: host
    volumes:
      - ./alloy-config.alloy:/etc/alloy/config.alloy
      - /proc:/proc:ro
      - /sys:/sys:ro
    command:
      - run
      - /etc/alloy/config.alloy

Eller kör det direkt på värden:

Bash
alloy run alloy-config.alloy

Relabel-regeln ger varje profils tjänst namnet på processens körbara fil.

Go

Go-SDK:t laddar upp pprof. Peka dess serveradress mot Status200s bas-URL och skicka din intagstoken som auth-token:

Go
import "github.com/grafana/pyroscope-go"

pyroscope.Start(pyroscope.Config{
    ApplicationName: "my-service",
    ServerAddress:   "https://status200.ru/pyroscope",
    AuthToken:       "YOUR_STATUS200_INGESTION_TOKEN",
    ProfileTypes: []pyroscope.ProfileType{
        pyroscope.ProfileCPU,
        pyroscope.ProfileAllocObjects,
        pyroscope.ProfileAllocSpace,
        pyroscope.ProfileInuseObjects,
        pyroscope.ProfileInuseSpace,
        pyroscope.ProfileGoroutines,
    },
})

Node.js

Node.js-SDK:t laddar upp pprof:

JavaScript
const Pyroscope = require("@pyroscope/nodejs");

Pyroscope.init({
  serverAddress: "https://status200.ru/pyroscope",
  appName: "my-service",
  authToken: "YOUR_STATUS200_INGESTION_TOKEN",
});

Pyroscope.start();

Python

Python-SDK:t laddar upp folded text:

Python
import pyroscope

pyroscope.configure(
    application_name="my-service",
    server_address="https://status200.ru/pyroscope",
    auth_token="YOUR_STATUS200_INGESTION_TOKEN",
)

.NET

Pyroscopes .NET-profilerare är en inbyggd CLR-profilerare: den kräver inga kodändringar och slås på helt via miljövariabler. Ladda ned versionen för din avbildning från pyroscope-dotnet releases (glibc eller musl för Alpine, x86_64 eller aarch64) och läs in den i körmiljön:

DockerfileDockerfile
FROM alpine:3.20 AS pyroscope-profiler
ARG PYROSCOPE_DOTNET_VERSION=1.5.1
ADD https://github.com/grafana/pyroscope-dotnet/releases/download/pyroscope-${PYROSCOPE_DOTNET_VERSION}/pyroscope.${PYROSCOPE_DOTNET_VERSION}-glibc-x86_64.tar.gz /tmp/pyroscope.tar.gz
RUN mkdir -p /pyroscope && tar -xzf /tmp/pyroscope.tar.gz -C /pyroscope

FROM mcr.microsoft.com/dotnet/aspnet:10.0
# ... your application ...
COPY --from=pyroscope-profiler /pyroscope /pyroscope
ENV CORECLR_ENABLE_PROFILING=1
ENV CORECLR_PROFILER={BD1A650D-AC5D-4896-B64F-D6FA25D6B26A}
ENV CORECLR_PROFILER_PATH=/pyroscope/Pyroscope.Profiler.Native.so
ENV LD_PRELOAD=/pyroscope/Pyroscope.Linux.ApiWrapper.x64.so
ENV LD_LIBRARY_PATH=/pyroscope

Peka den sedan mot Status200, till exempel i din Kubernetes- / Helm-miljö:

Bash
PYROSCOPE_APPLICATION_NAME=my-service
PYROSCOPE_PROFILING_ENABLED=1
PYROSCOPE_SERVER_ADDRESS=https://status200.ru/pyroscope
PYROSCOPE_BASIC_AUTH_USER=oneuptime
PYROSCOPE_BASIC_AUTH_PASSWORD=YOUR_STATUS200_INGESTION_TOKEN

Intagstoken hör hemma i lösenordet för Basic-autentisering. Användarnamnet kan vara vilket icke-tomt värde som helst, men profileraren skickar inga inloggningsuppgifter alls om inte båda är satta. För att i stället skicka token som huvud sätter du PYROSCOPE_HTTP_HEADERS={"x-status200-token":"YOUR_STATUS200_INGESTION_TOKEN"}.

Hur token skickas beror på profilerarens version. 1.5 och senare ignorerar PYROSCOPE_AUTH_TOKEN, så om du uppgraderar från en äldre version och behåller den inställningen avvisas varje uppladdning med 401:

pyroscope-dotnet-versionLaddar upp tillTokeninställning
v0.13 och äldre/pyroscope/ingestPYROSCOPE_AUTH_TOKEN
v0.14 till 1.4/pyroscope/push.v1.PusherService/PushPYROSCOPE_AUTH_TOKEN
1.5 och senare/pyroscope/push.v1.PusherService/PushPYROSCOPE_BASIC_AUTH_USER=oneuptime och PYROSCOPE_BASIC_AUTH_PASSWORD=<token> (båda måste vara satta), eller PYROSCOPE_HTTP_HEADERS={"x-status200-token":"<token>"}

Versioner före 1.0 är taggade v<version>-pyroscope i stället för pyroscope-<version> (till exempel https://github.com/grafana/pyroscope-dotnet/releases/download/v0.13.0-pyroscope/pyroscope.0.13.0-glibc-x86_64.tar.gz); profilerarens GUID och filnamnen är desamma i alla versioner.

CPU-profilering är på som standard. Profilering av faktisk tid, allokeringar, undantag och låskonflikter är valfri: sätt PYROSCOPE_PROFILING_WALLTIME_ENABLED, PYROSCOPE_PROFILING_ALLOCATION_ENABLED, PYROSCOPE_PROFILING_EXCEPTION_ENABLED eller PYROSCOPE_PROFILING_LOCK_ENABLED till true. Statiska etiketter hör hemma i PYROSCOPE_LABELS (key:value,key:value).

Profileraren laddar upp var 15:e sekund och komprimerar inte sina uppladdningar, så en hårt belastad tjänst kan skicka flera MB per uppladdning. Status200s egen ingress tar emot upp till 16 MB på /pyroscope; om en annan proxy står framför Status200 (till exempel ingress-nginx, vars standard för proxy-body-size är 1 MB), höj även dess storleksgräns för /pyroscope, annars avvisas stora uppladdningar med 413 innan de når Status200.

Java

Pyroscopes Java-agent laddar upp profiler i JFR-format, som Status200 inte tar in ännu. Profilera i stället Java-tjänster med Grafana Alloy (fliken Grafana Alloy): det fångar JVM-CPU-profiler utan agent eller kodändringar.

Ruby och Rust fungerar som Go, Node.js och Python: installera Pyroscope-SDK:t för ditt språk och sätt serveradressen till https://status200.ru/pyroscope med din intagstoken som auth-token (eller, om din SDK-version bara erbjuder Basic-autentisering, som lösenord för Basic-autentisering).

Profiltyper som stöds

En pprof kan deklarera flera sampeltyper; varje uppladdad profil lagras under en av dem: CPU-tid (cpu i nanosekunder) om den har det, annars faktisk tid, annars byte som används och därefter allokerade byte, annars den första typen den deklarerar. Alla typer lagras och kan visas; typerna nedan får egen gruppering, enheter och etiketter i Status200:

ProfiltypVisas somEnhet
cpu, samplesCPU-tidnanosekunder
wallFaktisk tidnanosekunder
inuse_space, alloc_space, heapMinne (byte)byte
inuse_objects, alloc_objectsMinne (antal objekt)antal
mutex, contention, blockLåskonfliktnanosekunder
goroutineGoroutines (Go)antal

Allt annat (till exempel en egen sampeltyp) visas under "Annat" med sitt råa namn.

Kontrollera att det fungerar

  1. Kontrollera din token

    Intagsslutpunkterna svarar 401 på en saknad eller ogiltig token, men de flesta profilerare visar inte det någonstans där du ser det (.NET-profileraren loggar till exempel bara HTTP-svar på felsökningsnivå). Fråga valideringsslutpunkten direkt:

    Bash
    curl -i -H "x-status200-token: YOUR_STATUS200_INGESTION_TOKEN" \
      https://status200.ru/otlp/v1/validate

    En giltig token ger 200 med {"valid": true, ...}, och dess keyType måste vara Server: en webbläsarnyckel är också giltig men kan inte skicka profiler. En okänd, återkallad, inaktiverad eller utgången token ger 401.

  2. Öppna profilsidan

    Gå till Produkter → Prestandaprofiler i Status200s instrumentpanel. Med Alloys insamlingsintervall på 15 sekunder (eller SDK:ernas uppladdningsintervall på 10 till 15 sekunder) visas de första profilerna och deras flamdiagram inom en eller två minuter efter att agenten har startat.

  3. Kontrollera tjänsten

    Profiler knyts till den telemetritjänst som SDK:ts application_name / appName / PYROSCOPE_APPLICATION_NAME nämner (eller namnet på processens körbara fil med Alloys relabel-regel ovan).

  4. Fortfarande inget? Titta på uppladdningsstatusen

    För .NET-profileraren sätter du DD_TRACE_DEBUG=1 på applikationen i en minut: då loggar den en rad PyroscopePprofSink <status> för varje uppladdning. 200 betyder att Status200 tog emot den; 401 är token; 404 betyder oftast att PYROSCOPE_SERVER_ADDRESS saknar suffixet /pyroscope; 413 betyder att en proxy framför Status200 avvisade uppladdningen på grund av storleken (se fliken .NET under Skicka profiler). Om du driver Status200 själv registrerar ingressens (nginx) åtkomstlogg samma status för varje begäran till /pyroscope.

Utforska profiler i Status200

Produkter → Prestandaprofiler öppnar profileraren på dess Översikt. Den svarar i ord före något diagram: vart tiden går ("I checkout gick 42% av CPU-tid till JSON.parse.") och, när den mest belastade funktionen hör till ett bibliotek eller körtiden, den funktion i din egen kod som tar mest, med biblioteks- och körtidskoden den anropar. Högst upp väljer du en tjänst, en profiltyp som den har data för (CPU-tid, Faktisk tid, Minne, Allokeringar, Lås eller Goroutines, eller en typ under Fler profiltyper), och ett tidsfönster.

KortVad det visar
Vart CPU-tiden gårAlla profiler i tidsfönstret, sammanslagna till ett flamdiagram. Ju bredare en ram är, desto större andel har den. Klicka på en ram för att zooma in.
FunktionerFunktionerna som tar mest, sorterade efter Egen (tiden i funktionens egen kod), Totalt (med allt den anropar) eller Din kod (dina egna funktioner, var och en med biblioteks- och körtidskoden den anropar: den tid en ändring i dem kan vinna tillbaka).
Profilerade tjänsterVarje profilerad tjänst, mest belastade först. Kärntrådar som eBPF-profileraren samplar döljs.

Jämför två tidsfönster

Jämför med anger vad tidsfönstret jämförs med: Perioden innan, Samma tid i går, Samma tid förra veckan eller en driftsättning under Före och efter en ändring. Andelar jämförs i stället för summor, så mer trafik ensamt flyttar ingenting. Rubriken nämner funktionen vars andel växte mest, och den egna kod som växte; flamdiagrammet blir Vad som ändrades, där röda ramar tar en större andel efteråt och gröna en mindre; och Funktioner som ändrades listar varje funktions andel före och efter.

En funktion

Klicka på en funktion för att öppna dess panel: dess andel som Egen, Totalt och Din kod, Vem anropar den och Vad den anropar, en länk till dess fil och rad i ditt repository när ett är anslutet, och Markera i flamdiagrammet. För en funktion från ett bibliotek eller körtiden nämner panelen den funktion i din egen kod som anropar den, där en ändring kan göra den billigare. En länk under andelarna skapar en varning för funktionens andel, över det den tar i dag: se Profilövervakning.

När en funktion i din egen kod tar minst 5 % av profilens tid eller minne, eller dess andel har vuxit med 3 enheter eller mer sedan tidsfönstret den jämförs med, erbjuder panelen Åtgärda med AI: Status200 AI startar en uppgift i det repository som innehåller funktionen, med profilen som underlag, och öppnar en pull request som du granskar (se Code). Status200 AI läser också profiler i sina svar och undersökningar, så du kan fråga vilka funktioner som använder mest CPU-tid.

En enskild profil

Alla profiler listar varje uppladdning. En profils sida har tre vyer:

VyVad den visar
FlamdiagramVarje stapel är en funktion i anropsstacken, och dess bredd är proportionell mot tiden eller resurserna den förbrukade. Klicka på en funktion för att zooma in och se vilka som anropar den och vilka den anropar.
Top functionsProfilens funktioner, sorterade efter egen eller total tid. Bara min kod döljer biblioteksramar.
Diff vs. baselineProfilen jämförd med en tidigare period (jämfört med för 1 timme sedan, jämfört med igår eller jämfört med förra veckan), med funktionerna under Most regressed och Most improved.

Download pprof sparar profilen för lokala verktyg som go tool pprof.

Koppling till spår

När en profil bär trace- och span-ID:n (till exempel som sampeletiketter trace_id / span_id) kan du gå direkt från ett långsamt span i ett spår till motsvarande CPU- eller minnesprofil för att förstå exakt vilken kod som kördes, och Open linked trace går åt andra hållet.

Ett spans flik Profil innehåller även de sampel som är kopplade till spans som ligger under det, eftersom profilerare ofta tillskriver en begärans CPU-tid ett underordnat span i stället för själva begärans span.

Ett spårs sida länkar också till profileraren för spårets tjänst under de 15 minuterna före och efter, när tjänsten profilerades då, och sidan Prestandaprofiler för en tjänst eller en värd öppnar profileraren för den tjänsten eller värden.

Datalagring

Profiler sparas lika länge som projektets telemetri: Projektinställningar → Telemetri och APM → Datalagring anger Standardlagring (dagar), 15 dagar om du inte ändrar den. Data raderas automatiskt när lagringsperioden är slut. Abonnemang med undantag för lagring kan också spara profiler längre eller kortare än annan telemetri, eller ange lagring per tjänst på tjänstens sida Inställningar.

Nästa steg