Naar inhoud springen
Continue profilering

Continue profilering

Bekijken als Markdown

Continue profilering laat zien waaraan uw applicatie CPU-tijd en geheugen besteedt, functie voor functie. Status200 biedt een met Pyroscope compatibele ingest-API, dus alles wat naar een Pyroscope-server kan sturen (de eBPF-profiler van Grafana Alloy of een Pyroscope-SDK voor uw taal) kan naar Status200 sturen, en u leest het resultaat als flame graphs naast uw logboeken, metrieken en traces.

Hoe het werkt

Een profiler neemt steekproeven van uw processen en uploadt om de paar seconden een profiel naar het endpoint /pyroscope van Status200, met uw ingestiesleutel. Status200 slaat elk profiel op onder de service die het noemt en tekent het als flame graph onder Prestatieprofielen.

flowchart TB subgraph profilers["Profilers"] direction LR alloy["Grafana Alloy (eBPF)"] sdk["Pyroscope-SDK<br/>in uw app"] end alloy -->|"push-API"| endpoint["Status200 /pyroscope"] sdk -->|"ingest- of push-API"| endpoint endpoint --> profiles["Prestatieprofielen"] profiles -.->|"trace- en span-ID's"| traces["Gekoppelde traces"]

Hoe profielen bij Status200 komen

Voordat u begint

U hebt een telemetrie-ingestiesleutel van het type Server nodig. Hebt u er nog geen:

  1. De ingestiesleutels openen

    Ga naar Producten → Projectinstellingen, open Telemetrie & APM in het zijmenu en kies Ingestiesleutels.

    De pagina met telemetrie-ingestiesleutels in de projectinstellingen

  2. Een sleutel aanmaken

    Klik op Inname-sleutel aanmaken. In het dialoogvenster is de naam van de sleutel al ingevuld en Server gekozen (het soort sleutel waarmee een applicatie of een collector verstuurt), dus klik op Inname-sleutel aanmaken om hem aan te maken, of geef hem eerst een andere naam.

  3. Het geheim kopiëren

    De nieuwe sleutel opent op zijn eigen pagina. Kopieer de Geheime sleutel: dat is het ingestietoken dat de voorbeelden hieronder YOUR_STATUS200_INGESTION_TOKEN noemen.

    De pagina van een telemetrie-ingestiesleutel, met de geheime sleutel

Ingest-endpoint

InstellingWaarde
Basis-URL (adres van de Pyroscope-server)https://status200.ru/pyroscope
Authenticatieheaderx-status200-token: YOUR_STATUS200_INGESTION_TOKEN

Clients voegen hun eigen pad aan de basis-URL toe (/ingest bij de meeste Pyroscope-SDK's, /push.v1.PusherService/Push bij Grafana Alloy en de .NET-SDK vanaf v0.14), dus u configureert altijd alleen de basis-URL, zonder slash aan het eind.

Status200 leest het ingestietoken uit elk van deze bronnen; gebruik wat uw client ondersteunt:

MethodeWanneer gebruiken
Header x-status200-tokenClients waarmee u eigen headers kunt toevoegen.
Authorization: Bearer <token>SDK's met een optie authToken / auth_token: dat is wat ze versturen.
HTTP Basic-authenticatie, met het token als wachtwoord (willekeurige gebruikersnaam)Clients die alleen een gebruiker en wachtwoord voor Basic-authenticatie bieden.
Opmerking

Host u Status200 zelf? Vervang https://status200.ru door uw eigen host, bijvoorbeeld https://YOUR-ONEUPTIME-HOST/pyroscope.

Ondersteunde profielformaten

FormaatVerstuurd doorOndersteund
pprof (binaire protobuf, optioneel met gzip)Pyroscope-SDK's voor Go, Node.js en .NET; Grafana AlloyJa
Folded / collapsed tekstPyroscope-SDK's voor Python, Ruby en Rust (hun standaard uploadformaat)Ja
JFR (Java Flight Recorder)Pyroscope Java-agentNog niet: gebruik Grafana Alloy voor Java-services

Profielen versturen

Grafana Alloy profileert elk proces op een host zonder codewijzigingen en is de aanbevolen manier om te beginnen. Een Pyroscope-SDK draait daarentegen in uw applicatie.

Grafana Alloy

Grafana Alloy verzamelt met eBPF CPU-profielen van elk proces op een Linux-host: geen agent in uw applicatie en geen codewijzigingen. Het werkt voor Go, Rust, C/C++, Java, Python, Ruby, PHP, Node.js en .NET.

Maak de Alloy-configuratie:

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",
    }
  }
}

Draai het met Docker. eBPF heeft een geprivilegieerde container met de PID-naamruimte van de host nodig:

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

Of draai het rechtstreeks op de host:

Bash
alloy run alloy-config.alloy

De relabel-regel geeft de service van elk profiel de naam van het uitvoerbare bestand van het proces.

Go

De Go-SDK uploadt pprof. Laat het serveradres naar de basis-URL van Status200 wijzen en geef uw ingestietoken mee als 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

De Node.js-SDK uploadt 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

De Python-SDK uploadt folded tekst:

Python
import pyroscope

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

.NET

De Pyroscope .NET-profiler is een native CLR-profiler: hij heeft geen codewijzigingen nodig en wordt volledig via omgevingsvariabelen ingeschakeld. Download de release voor uw image van pyroscope-dotnet releases (glibc of musl voor Alpine, x86_64 of aarch64) en laad hem in de runtime:

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

Laat hem daarna naar Status200 wijzen, bijvoorbeeld in uw Kubernetes- / Helm-omgeving:

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

Het ingestietoken hoort in het Basic-auth-wachtwoord. De gebruikersnaam mag elke niet-lege waarde zijn, maar de profiler stuurt helemaal geen inloggegevens als niet beide zijn ingesteld. Om het token in plaats daarvan als header te sturen, stelt u PYROSCOPE_HTTP_HEADERS={"x-status200-token":"YOUR_STATUS200_INGESTION_TOKEN"} in.

Hoe het token wordt meegegeven, hangt af van de profilerrelease. 1.5 en later negeren PYROSCOPE_AUTH_TOKEN; als u vanaf een oudere release bijwerkt en die instelling houdt, wordt elke upload dus geweigerd met 401:

pyroscope-dotnet-releaseUploadt naarTokeninstelling
v0.13 en eerder/pyroscope/ingestPYROSCOPE_AUTH_TOKEN
v0.14 tot en met 1.4/pyroscope/push.v1.PusherService/PushPYROSCOPE_AUTH_TOKEN
1.5 en later/pyroscope/push.v1.PusherService/PushPYROSCOPE_BASIC_AUTH_USER=oneuptime en PYROSCOPE_BASIC_AUTH_PASSWORD=<token> (beide moeten zijn ingesteld), of PYROSCOPE_HTTP_HEADERS={"x-status200-token":"<token>"}

Releases vóór 1.0 hebben de tag v<version>-pyroscope in plaats van pyroscope-<version> (bijvoorbeeld https://github.com/grafana/pyroscope-dotnet/releases/download/v0.13.0-pyroscope/pyroscope.0.13.0-glibc-x86_64.tar.gz); de GUID van de profiler en de bestandsnamen zijn in elke release hetzelfde.

CPU-profilering staat standaard aan. Profilering van kloktijd, allocaties, exceptions en lock-conflicten is optioneel: zet PYROSCOPE_PROFILING_WALLTIME_ENABLED, PYROSCOPE_PROFILING_ALLOCATION_ENABLED, PYROSCOPE_PROFILING_EXCEPTION_ENABLED of PYROSCOPE_PROFILING_LOCK_ENABLED op true. Statische labels horen in PYROSCOPE_LABELS (key:value,key:value).

De profiler uploadt elke 15 seconden en comprimeert zijn uploads niet, dus een drukke service kan meerdere MB per upload sturen. De eigen ingress van Status200 accepteert tot 16 MB op /pyroscope; staat er nog een proxy vóór Status200 (bijvoorbeeld ingress-nginx, waarvan de standaard proxy-body-size 1 MB is), verhoog dan ook diens groottelimiet voor /pyroscope, anders worden grote uploads met 413 geweigerd voordat ze Status200 bereiken.

Java

De Pyroscope Java-agent uploadt profielen in het JFR-formaat, dat Status200 nog niet opneemt. Profileer Java-services in plaats daarvan met Grafana Alloy (het tabblad Grafana Alloy): dat legt JVM-CPU-profielen vast zonder agent of codewijzigingen.

Ruby en Rust werken zoals Go, Node.js en Python: installeer de Pyroscope-SDK voor uw taal en stel het serveradres in op https://status200.ru/pyroscope met uw ingestietoken als auth-token (of, als uw SDK-versie alleen Basic-auth biedt, als Basic-auth-wachtwoord).

Ondersteunde profieltypen

Een pprof kan meerdere sampletypen declareren; elk geüpload profiel wordt onder één daarvan opgeslagen: CPU-tijd (cpu in nanoseconden) als het die heeft, anders kloktijd, anders bytes in gebruik en daarna toegewezen bytes, anders het eerste type dat het declareert. Elk type wordt opgeslagen en is te bekijken; de typen hieronder krijgen eigen groepering, eenheden en labels in Status200:

ProfieltypeWeergegeven alsEenheid
cpu, samplesCPU-tijdnanoseconden
wallKloktijdnanoseconden
inuse_space, alloc_space, heapGeheugen (bytes)bytes
inuse_objects, alloc_objectsGeheugen (aantal objecten)aantal
mutex, contention, blockLock-conflictennanoseconden
goroutineGoroutines (Go)aantal

Al het andere (bijvoorbeeld een eigen sampletype) verschijnt onder "Overig" met zijn ruwe naam.

Controleren of het werkt

  1. Uw token controleren

    De ingest-endpoints beantwoorden een ontbrekend of ongeldig token met 401, maar de meeste profilers tonen dat nergens waar u het ziet (de .NET-profiler logt HTTP-antwoorden bijvoorbeeld alleen op debugniveau). Vraag het validatie-endpoint rechtstreeks:

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

    Een geldig token geeft 200 met {"valid": true, ...}, en de keyType ervan moet Server zijn: een browsersleutel is ook geldig, maar kan geen profielen versturen. Een onbekend, ingetrokken, uitgeschakeld of verlopen token geeft 401.

  2. De profielpagina openen

    Ga in het Status200-dashboard naar Producten → Prestatieprofielen. Met het verzamelinterval van 15 seconden van Alloy (of het uploadinterval van 10 tot 15 seconden van de SDK's) verschijnen de eerste profielen en hun flame graphs binnen een of twee minuten na het starten van de agent.

  3. De service controleren

    Profielen worden gekoppeld aan de telemetrieservice die application_name / appName / PYROSCOPE_APPLICATION_NAME van de SDK noemt (of de naam van het uitvoerbare bestand van het proces, met de relabel-regel van Alloy hierboven).

  4. Nog steeds niets? Bekijk de uploadstatus

    Zet bij de .NET-profiler een minuut lang DD_TRACE_DEBUG=1 op de applicatie: dan logt hij voor elke upload een regel PyroscopePprofSink <status>. 200 betekent dat Status200 de upload heeft geaccepteerd; 401 is het token; 404 betekent meestal dat PYROSCOPE_SERVER_ADDRESS het achtervoegsel /pyroscope mist; 413 betekent dat een proxy vóór Status200 de upload vanwege de grootte heeft geweigerd (zie het tabblad .NET onder Profielen versturen). Host u Status200 zelf, dan registreert het toegangslogboek van de ingress (nginx) dezelfde status voor elk verzoek aan /pyroscope.

Profielen verkennen in Status200

Producten → Prestatieprofielen opent de Profiler op zijn Overzicht. Die antwoordt in woorden voordat er een grafiek komt: waar de tijd heen gaat ("In checkout neemt JSON.parse 42% van de CPU-tijd in.") en, wanneer de drukste functie van een bibliotheek of de runtime is, welke functie van uw eigen code het meest inneemt, met de bibliotheek- en runtimecode die ze aanroept. Kies bovenaan een service, een soort profiel waarvoor ze gegevens heeft (CPU-tijd, Kloktijd, Geheugen, Allocaties, Locks of Goroutines, of één type onder Meer profieltypen) en een tijdvenster.

KaartWat die toont
Waar de CPU-tijd heen gaatAlle profielen in het tijdvenster, samengevoegd tot één flame graph. Hoe breder een frame, hoe groter het aandeel. Klik op een frame om in te zoomen.
FunctiesDe functies die het meest innemen, gerangschikt op Eigen (de tijd in de eigen code van de functie), Totaal (met alles wat ze aanroept) of Uw code (uw eigen functies, elk met de bibliotheek- en runtimecode die ze aanroept: de tijd die een wijziging eraan kan terugwinnen).
Geprofileerde servicesElke geprofileerde service, de drukste eerst. Kernelthreads die de eBPF-profiler samplet, worden verborgen.

Twee tijdvensters vergelijken

Vergelijken met bepaalt waarmee het tijdvenster wordt vergeleken: De periode ervoor, Hetzelfde tijdstip gisteren, Hetzelfde tijdstip vorige week, of een deploy onder Voor en na een wijziging. Aandelen worden vergeleken, geen totalen, dus alleen meer verkeer verschuift niets. De kop noemt de functie waarvan het aandeel het meest groeide, en de eigen code die groeide; de flame graph wordt Wat er veranderde, waar rode frames daarna een groter aandeel innemen en groene een kleiner; en Gewijzigde functies toont het aandeel van elke functie voor en na.

Eén functie

Klik op een functie om haar paneel te openen: haar aandeel als Eigen, Totaal en Uw code, Wie haar aanroept en Wat ze aanroept, een link naar haar bestand en regel in uw repository wanneer er een is gekoppeld, en Markeren in de flame graph. Bij een functie van een bibliotheek of de runtime noemt het paneel de functie van uw eigen code die haar aanroept, waar een wijziging haar goedkoper kan maken. Een link onder de aandelen stelt een waarschuwing in op het aandeel van de functie, boven wat ze vandaag inneemt: zie Profielen-monitor.

Wanneer een functie van uw eigen code minstens 5% van de tijd of het geheugen van het profiel inneemt, of haar aandeel met 3 punten of meer is gegroeid sinds het tijdvenster waarmee het wordt vergeleken, biedt het paneel Oplossen met AI aan: Status200 AI start een taak in de repository die de functie bevat, met het profiel als bewijs, en opent een pull request die u beoordeelt (zie Code). Status200 AI leest profielen ook in zijn antwoorden en onderzoeken, dus u kunt vragen welke functies de meeste CPU-tijd gebruiken.

Eén profiel

Alle profielen toont elke upload. De pagina van een profiel heeft drie weergaven:

WeergaveWat die toont
Flame graphElke balk is een functie in de aanroepstack, en de breedte is evenredig aan de verbruikte tijd of resources. Klik op een functie om in te zoomen en de aanroepers en aangeroepen functies te zien.
Top functionsDe functies in het profiel, gerangschikt op eigen of totale tijd. Alleen mijn code verbergt bibliotheekframes.
Diff vs. baselineHet profiel vergeleken met een eerdere periode (t.o.v. 1 uur geleden, t.o.v. gisteren of t.o.v. vorige week), met de functies onder Most regressed en Most improved.

Download pprof slaat het profiel op voor lokale tools zoals go tool pprof.

Tracecorrelatie

Wanneer een profiel trace- en span-ID's draagt (bijvoorbeeld als samplelabels trace_id / span_id), gaat u rechtstreeks van een trage tracespan naar het bijbehorende CPU- of geheugenprofiel om precies te begrijpen welke code draaide, en Open linked trace gaat de andere kant op.

Het tabblad Profiel van een span bevat ook de samples die gekoppeld zijn aan de spans die eronder zijn genest, omdat profilers de CPU-tijd van een verzoek vaak aan een kindspan toekennen in plaats van aan de span van het verzoek zelf.

De pagina van een trace linkt ook naar de Profiler op de service van de trace, voor de 15 minuten ervoor en erna, wanneer die service toen werd geprofileerd, en de pagina Prestatieprofielen van een service of host opent de Profiler op die service of host.

Gegevensbewaring

Profielen worden bewaard zolang de telemetrie van uw project: Projectinstellingen → Telemetrie & APM → Gegevensbewaring stelt de Standaardbewaring (dagen) in, 15 dagen tenzij u die wijzigt. Gegevens worden automatisch verwijderd wanneer de bewaartermijn afloopt. Abonnementen met bewaaruitzonderingen kunnen profielen ook langer of korter bewaren dan andere telemetrie, of de bewaring per service instellen op de pagina Instellingen van de service.

Volgende stappen