Kontinuerlig profilering
Kontinuerlig profilering viser, hvad din applikation bruger CPU-tid og hukommelse på, funktion for funktion. Status200 stiller et Pyroscope-kompatibelt indlæsnings-API til rådighed, så alt, der kan sende til en Pyroscope-server (Grafana Alloys eBPF-profiler eller et Pyroscope-SDK til dit sprog), kan sende til Status200, og du aflæser resultatet som flammegrafer ved siden af dine logs, metrikker og spor.
Sådan virker det
En profiler tager stikprøver af dine processer og uploader en profil med få sekunders mellemrum til Status200s endpoint /pyroscope med din indtagelsesnøgle. Status200 gemmer hver profil under den tjeneste, den nævner, og tegner den som en flammegraf under Ydeevneprofiler.
Sådan når profiler frem til Status200
Før du begynder
Du skal bruge en telemetri-indtagelsesnøgle af typen Server. Hvis du ikke har en endnu:
Åbn indtagelsesnøglerne
Gå til Produkter → Projektindstillinger, åbn Telemetri og APM i sidemenuen, og vælg Indtagelsesnøgler.

Opret en nøgle
Klik på Opret ingestion-nøgle. Dialogen har allerede nøglens navn udfyldt og Server valgt (den slags nøgle, en applikation eller en collector sender med), så klik på Opret ingestion-nøgle for at oprette den, eller omdøb den først.
Kopiér hemmeligheden
Den nye nøgle åbner på sin egen side. Kopiér dens Hemmelig nøgle: det er det indtagelsestoken, som eksemplerne nedenfor kalder
YOUR_STATUS200_INGESTION_TOKEN.
Indlæsnings-endpoint
| Indstilling | Værdi |
|---|---|
| Basis-URL (Pyroscope-serverens adresse) | https://status200.ru/pyroscope |
| Godkendelses-header | x-status200-token: YOUR_STATUS200_INGESTION_TOKEN |
Klienter føjer deres egen sti til basis-URL'en (/ingest for de fleste Pyroscope-SDK'er, /push.v1.PusherService/Push for Grafana Alloy og .NET-SDK'et fra v0.14), så du konfigurerer altid kun basis-URL'en uden afsluttende skråstreg.
Status200 læser indtagelsestokenet fra en hvilken som helst af disse; brug den, din klient understøtter:
| Metode | Hvornår du bruger den |
|---|---|
Header x-status200-token | Klienter, der lader dig tilføje egne headers. |
Authorization: Bearer <token> | SDK'er med en indstilling authToken / auth_token: det er det, de sender. |
| HTTP Basic-godkendelse med tokenet som adgangskode (vilkårligt brugernavn) | Klienter, der kun tilbyder bruger og adgangskode til Basic-godkendelse. |
Hoster du selv Status200? Erstat https://status200.ru med din egen vært, for eksempel https://YOUR-ONEUPTIME-HOST/pyroscope.
Understøttede profilformater
| Format | Sendes af | Understøttet |
|---|---|---|
| pprof (binær protobuf, eventuelt gzip-komprimeret) | Pyroscope-SDK'er til Go, Node.js og .NET; Grafana Alloy | Ja |
| Folded / collapsed tekst | Pyroscope-SDK'er til Python, Ruby og Rust (deres standard-uploadformat) | Ja |
| JFR (Java Flight Recorder) | Pyroscope Java-agent | Endnu ikke: brug Grafana Alloy til Java-tjenester |
Send profiler
Grafana Alloy profilerer hver proces på en vært uden kodeændringer og er den anbefalede måde at starte på. Et Pyroscope-SDK kører i stedet inde i din applikation.
Grafana Alloy
Grafana Alloy indsamler med eBPF CPU-profiler fra hver proces på en Linux-vært: ingen agent i din applikation og ingen kodeændringer. Det virker for Go, Rust, C/C++, Java, Python, Ruby, PHP, Node.js og .NET.
Opret Alloy-konfigurationen:
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 privilegeret container med værtens PID-navnerum:
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.alloyEller kør det direkte på værten:
alloy run alloy-config.alloyRelabel-reglen navngiver hver profils tjeneste efter processens eksekverbare fil.
Go
Go-SDK'et uploader pprof. Peg dets serveradresse på Status200s basis-URL, og giv dit indtagelsestoken som auth-token:
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'et uploader pprof:
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'et uploader folded tekst:
import pyroscope
pyroscope.configure(
application_name="my-service",
server_address="https://status200.ru/pyroscope",
auth_token="YOUR_STATUS200_INGESTION_TOKEN",
).NET
Pyroscope .NET-profileren er en indbygget CLR-profiler: den kræver ingen kodeændringer og slås helt til via miljøvariabler. Hent udgivelsen til dit image fra pyroscope-dotnet releases (glibc eller musl til Alpine, x86_64 eller aarch64), og indlæs den i runtimen:
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=/pyroscopePeg den derefter på Status200, for eksempel i dit Kubernetes- / Helm-miljø:
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_TOKENIndtagelsestokenet skal i Basic-godkendelsens adgangskode. Brugernavnet kan være en hvilken som helst ikke-tom værdi, men profileren sender slet ingen legitimationsoplysninger, medmindre begge er sat. For i stedet at sende tokenet som header skal du sætte PYROSCOPE_HTTP_HEADERS={"x-status200-token":"YOUR_STATUS200_INGESTION_TOKEN"}.
Hvordan tokenet gives, afhænger af profilerens udgivelse. 1.5 og nyere ignorerer PYROSCOPE_AUTH_TOKEN, så hvis du opgraderer fra en ældre udgivelse og beholder den indstilling, afvises hver upload med 401:
| pyroscope-dotnet-udgivelse | Uploader til | Tokenindstilling |
|---|---|---|
| v0.13 og ældre | /pyroscope/ingest | PYROSCOPE_AUTH_TOKEN |
| v0.14 til 1.4 | /pyroscope/push.v1.PusherService/Push | PYROSCOPE_AUTH_TOKEN |
| 1.5 og nyere | /pyroscope/push.v1.PusherService/Push | PYROSCOPE_BASIC_AUTH_USER=oneuptime og PYROSCOPE_BASIC_AUTH_PASSWORD=<token> (begge skal være sat), eller PYROSCOPE_HTTP_HEADERS={"x-status200-token":"<token>"} |
Udgivelser før 1.0 er tagget v<version>-pyroscope i stedet for pyroscope-<version> (for eksempel https://github.com/grafana/pyroscope-dotnet/releases/download/v0.13.0-pyroscope/pyroscope.0.13.0-glibc-x86_64.tar.gz); profilerens GUID og filnavnene er de samme i alle udgivelser.
CPU-profilering er slået til som standard. Profilering af vægur-tid, allokeringer, exceptions og låsekonflikter er valgfri: sæt PYROSCOPE_PROFILING_WALLTIME_ENABLED, PYROSCOPE_PROFILING_ALLOCATION_ENABLED, PYROSCOPE_PROFILING_EXCEPTION_ENABLED eller PYROSCOPE_PROFILING_LOCK_ENABLED til true. Statiske labels skal i PYROSCOPE_LABELS (key:value,key:value).
Profileren uploader hvert 15. sekund og komprimerer ikke sine uploads, så en travl tjeneste kan sende flere MB pr. upload. Status200s egen ingress accepterer op til 16 MB på /pyroscope; hvis en anden proxy står foran Status200 (for eksempel ingress-nginx, hvis standard for proxy-body-size er 1 MB), skal du også hæve dens størrelsesgrænse for /pyroscope, ellers afvises store uploads med 413, før de når Status200.
Java
Pyroscope Java-agenten uploader profiler i JFR-format, som Status200 endnu ikke indlæser. Profilér i stedet Java-tjenester med Grafana Alloy (fanen Grafana Alloy): det opfanger JVM-CPU-profiler uden agent eller kodeændringer.
Ruby og Rust virker som Go, Node.js og Python: installér Pyroscope-SDK'et til dit sprog, og sæt serveradressen til https://status200.ru/pyroscope med dit indtagelsestoken som auth-token (eller, hvis din SDK-version kun tilbyder Basic-godkendelse, som adgangskode til Basic-godkendelse).
Understøttede profiltyper
En pprof kan erklære flere sampletyper; hver uploadet profil gemmes under én af dem: CPU-tid (cpu i nanosekunder), hvis den har det, ellers vægur-tid, ellers bytes i brug og derefter allokerede bytes, ellers den første type, den erklærer. Enhver type gemmes og kan ses; typerne nedenfor får egen gruppering, enheder og betegnelser i Status200:
| Profiltype | Vises som | Enhed |
|---|---|---|
cpu, samples | CPU-tid | nanosekunder |
wall | Vægur-tid | nanosekunder |
inuse_space, alloc_space, heap | Hukommelse (bytes) | bytes |
inuse_objects, alloc_objects | Hukommelse (antal objekter) | antal |
mutex, contention, block | Lås-strid | nanosekunder |
goroutine | Goroutines (Go) | antal |
Alt andet (for eksempel en brugerdefineret sampletype) vises under "Andet" med sit rå navn.
Kontrollér, at det virker
Tjek dit token
Indlæsnings-endpointene svarer
401på et manglende eller ugyldigt token, men de fleste profilere viser det ikke noget sted, hvor du ser det (.NET-profileren logger for eksempel kun HTTP-svar på debug-niveau). Spørg validerings-endpointet direkte:curl -i -H "x-status200-token: YOUR_STATUS200_INGESTION_TOKEN" \ https://status200.ru/otlp/v1/validateEt gyldigt token giver
200med{"valid": true, ...}, og detskeyTypeskal væreServer: en browsernøgle er også gyldig, men kan ikke sende profiler. Et ukendt, tilbagekaldt, deaktiveret eller udløbet token giver401.Åbn profilsiden
Gå i Status200-dashboardet til Produkter → Ydeevneprofiler. Med Alloys indsamlingsinterval på 15 sekunder (eller SDK'ernes uploadinterval på 10 til 15 sekunder) vises de første profiler og deres flammegrafer inden for et minut eller to, efter at agenten er startet.
Tjek tjenesten
Profiler knyttes til den telemetritjeneste, som SDK'ets
application_name/appName/PYROSCOPE_APPLICATION_NAMEnævner (eller processens eksekverbare filnavn med Alloys relabel-regel ovenfor).Stadig intet? Se på upload-status
For .NET-profileren skal du sætte
DD_TRACE_DEBUG=1på applikationen i et minut: så logger den en linjePyroscopePprofSink <status>for hver upload.200betyder, at Status200 accepterede den;401er tokenet;404betyder som regel, atPYROSCOPE_SERVER_ADDRESSmangler suffikset/pyroscope;413betyder, at en proxy foran Status200 afviste uploaden på grund af størrelsen (se fanen .NET under Send profiler). Hvis du selv kører Status200, registrerer ingressens (nginx) adgangslog den samme status for hver anmodning til/pyroscope.
Udforsk profiler i Status200
Produkter → Ydeevneprofiler åbner Profileren på dens Oversigt. Den svarer med ord før noget diagram: hvor tiden går hen ("I checkout gik 42% af CPU-tid til JSON.parse.") og, når den travleste funktion tilhører et bibliotek eller runtime, den funktion i din egen kode, der tager mest, med den biblioteks- og runtimekode, den kalder. Øverst vælger du en tjeneste, en profiltype, den har data for (CPU-tid, Vægur-tid, Hukommelse, Allokeringer, Låse eller Goroutines, eller en type under Flere profiltyper), og et tidsvindue.
| Kort | Hvad det viser |
|---|---|
| Hvor CPU-tiden går hen | Alle profiler i tidsvinduet, samlet i én flammegraf. Jo bredere en ramme er, jo større er dens andel. Klik på en ramme for at zoome ind. |
| Funktioner | De funktioner, der tager mest, sorteret efter Egen (tiden i funktionens egen kode), Total (med alt det, den kalder) eller Din kode (dine egne funktioner, hver med den biblioteks- og runtimekode, den kalder: den tid, en ændring af dem kan vinde tilbage). |
| Profilerede tjenester | Alle profilerede tjenester, travleste først. Kernetråde, som eBPF-profileren sampler, skjules. |
Sammenlign to tidsvinduer
Sammenlign med angiver, hvad tidsvinduet sammenlignes med: Perioden før, Samme tid i går, Samme tid i sidste uge eller en udrulning under Før og efter en ændring. Andele sammenlignes frem for summer, så mere trafik alene flytter intet. Overskriften nævner den funktion, hvis andel voksede mest, og den egne kode, der voksede; flammegrafen bliver til Hvad der ændrede sig, hvor røde rammer tager en større andel bagefter og grønne en mindre; og Funktioner, der ændrede sig viser hver funktions andel før og efter.
Én funktion
Klik på en funktion for at åbne dens panel: dens andel som Egen, Total og Din kode, Hvem kalder den og Hvad den kalder, et link til dens fil og linje i dit repository, når et er forbundet, og Fremhæv i flammegrafen. For en funktion fra et bibliotek eller runtime nævner panelet den funktion i din egen kode, der kalder den, hvor en ændring kan gøre den billigere. Et link under andelene opretter en advarsel om funktionens andel, over det, den tager i dag: se Profil-monitor.
Når en funktion i din egen kode tager mindst 5 % af profilens tid eller hukommelse, eller dens andel er vokset med 3 point eller mere siden det tidsvindue, den sammenlignes med, tilbyder panelet Ret med AI: Status200 AI starter en opgave i det repository, der indeholder funktionen, med profilen som bevis, og åbner en pull request, som du gennemgår (se Code). Status200 AI læser også profiler i sine svar og undersøgelser, så du kan spørge, hvilke funktioner der bruger mest CPU-tid.
Én profil
Alle profiler viser hver upload. En profils side har tre visninger:
| Visning | Hvad den viser |
|---|---|
| Flammegraf | Hver bjælke er en funktion i kaldstakken, og dens bredde er proportional med den tid eller de ressourcer, den brugte. Klik på en funktion for at zoome ind og se dens kaldere og kaldte funktioner. |
| Top functions | Profilens funktioner, sorteret efter egen eller samlet tid. Kun min kode skjuler biblioteksframes. |
| Diff vs. baseline | Profilen sammenlignet med en tidligere periode (vs. for 1 time siden, vs. i går eller vs. sidste uge), med funktionerne under Most regressed og Most improved. |
Download pprof gemmer profilen til lokale værktøjer som go tool pprof.
Sammenkædning med spor
Når en profil bærer trace- og span-ID'er (for eksempel som sample-labels trace_id / span_id), kan du gå direkte fra et langsomt span i et spor til den tilsvarende CPU- eller hukommelsesprofil for at forstå præcis, hvilken kode der kørte, og Open linked trace går den anden vej.
Et spans fane Profil indeholder også de samples, der er knyttet til de spans, der ligger under det, fordi profilere ofte tilskriver en anmodnings CPU-tid et underordnet span frem for selve anmodningens span.
Et spors side linker også til Profileren for sporets tjeneste i de 15 minutter før og efter, når tjenesten blev profileret dengang, og siden Ydeevneprofiler for en tjeneste eller en vært åbner Profileren for den tjeneste eller vært.
Dataopbevaring
Profiler gemmes lige så længe som dit projekts telemetri: Projektindstillinger → Telemetri og APM → Dataopbevaring sætter Standardopbevaring (dage), 15 dage, medmindre du ændrer det. Data slettes automatisk, når opbevaringsperioden udløber. Abonnementer med opbevaringsundtagelser kan også beholde profiler længere eller kortere end anden telemetri eller sætte opbevaring pr. tjeneste på tjenestens side Indstillinger.