Lire une réponse
Lisez chaque réponse dans cet ordre :- Lisez le statut HTTP.
- Vérifiez que le corps a la forme définie par la route.
- Vérifiez que chaque
project_idfait partie du périmètre de projets demandé. - Conservez telles quelles les valeurs d’énumération canoniques et les identifiants.
- Suivez
next_actionuniquement si le client prend en charge soncodeet satarget. - Traitez
null, un champ omis et une liste vide comme des états différents.
200 OK peut contenir une liste vide. Une liste de logs vide signifie
qu’aucun log ne correspond à la requête. Elle ne signifie pas que les problèmes,
les traces ou les actions sont vides aussi. Ne reliez pas des signaux parce que
leurs horodatages sont proches. Suivez une trace uniquement si la réponse
contient son trace_id exact.
Une réponse 404 et une liste vide sont deux résultats différents. Une route de liste renvoie []
quand aucun enregistrement ne correspond. Une route de détail renvoie 404 avec code: not_found
quand elle ne trouve aucun enregistrement lisible. Aucun de ces résultats ne prouve que l’ingestion
a échoué.
Données à envoyer
Les réponses ne valent que ce que vaut la télémétrie que vous envoyez. Envoyez ces valeurs dans chaque enveloppe ou configuration du SDK :releaseetenvironment.- Des noms stables pour les services, les actions et les métriques.
- Le contexte de trace quand des logs, des spans, des actions et des problèmes appartiennent à la même requête.
- Les valeurs de gravité canoniques :
info,warning,erroretcritical. - Des attributs utiles au débogage, sans secrets ni données personnelles inutiles.
Réponse d’ingestion
Les SDK publics lisent la réponse dePOST /v1/events à votre place. Le code de
l’application n’a pas à la traiter.
Réponse à un lot du SDK
Un lot du SDK accepté renvoie200 OK avec le nombre de signaux acceptés pour
chaque flux :
Les nombres portent uniquement sur ce lot. Si vous renvoyez un lot que LogBrew a
déjà accepté, la réponse contient
0 pour chaque flux et le nombre de signaux dans
already_accepted. Gardez les ID d’origine des signaux quand vous réessayez.
Réponse à une enveloppe native
POST /api/telemetry/ingest renvoie 200 OK avec le nombre d’éléments acceptés
pour chaque flux :
metrics ni context_updated. Ne les ajoutez
pas. already_accepted compte les éléments dont LogBrew a déjà accepté l’id pour
ce projet. Consultez l’enveloppe native directe.
Erreurs d’ingestion
Une réponse401 avec code: ingest_key_invalid signifie que le jeton bearer d’ingestion est
révoqué, expiré ou non valide pour le projet. Sur POST /v1/events, un jeton bearer
absent, ou un jeton bearer qui n’est pas une clé d’ingestion, renvoie 401 avec
code: unauthorized. Utilisez le jeton bearer d’ingestion actuel du projet. Ne
réessayez pas avec un jeton bearer de compte.
Un lot du SDK refusé renvoie 422 avec code: validation_failed :
error incluent SDK event batch requires at least one event et
SDK event type is not supported by this ingest route. Vérifiez la version du SDK
et la configuration du transport. N’envoyez pas de lot vide. Ne modifiez pas
les types ou les ID des signaux dans le seul but de faire passer la validation.
Une requête avec une autre méthode que POST renvoie 405 avec
code: method_not_allowed. Un corps JSON illisible renvoie code: invalid_json.
Format des réponses de liste de télémétrie
Par défaut, les routes de liste renvoient un tableau JSON brut. Une liste vide réussie vaut[].
Avec pagination=cursor, la route renvoie une enveloppe. La clé de la collection
correspond au signal :
next_cursor est un objet qui contient les champs de continuation, ou null sur la dernière
page. Les lignes vont de la plus récente à la plus ancienne. Consultez la pagination par curseur.
Réponse de log
Une page de logs avec curseur etlimit=1 :
level pour la compatibilité et severity pour l’affichage. Les deux
contiennent la valeur canonique. triage contient le résultat d’une règle de gravité. Consultez
les réponses des règles de gravité.
trace_id et span_id valent null quand le log n’a pas de lien de trace. Dans ce cas,
next_action vaut inspect_related_logs avec la cible telemetry_logs. Les logs,
les problèmes et les actions utilisent les deux mêmes paires next_action.
GET /api/logs/{log_id} renvoie un seul log, sous la même forme.
Réponse de problème
GET /api/telemetry/issues/{issue_id} renvoie un problème groupé. La liste
renvoie les mêmes objets. Cet exemple utilise la version de réponse par défaut, la version 1 :
status vaut unresolved, resolved ou ignored. Pour un
problème archivé, triage.ignored vaut true. Pour les paires next_action et
les lectures qui en découlent, consultez
Investiguer un problème.
first_seen_at et last_seen_at sont les heures de la première et de la plus
récente occurrence. Elles ne changent pas quand le statut change.
Certains champs n’apparaissent que si LogBrew dispose des données :
symbolication.status vaut resolved, invalid_metadata,
artifact_not_found, source_not_resolved ou unavailable. La liste,
les changements de statut et les changements de règle ne renvoient pas symbolication.
Avec response_version=2, le problème a les mêmes champs, avec ces changements :
high pour error
et critical, medium pour warning et low pour info. Elle utilise
triage.effective_severity : une règle de gravité de problème peut donc la modifier.
Avec response_version=3, le problème a tous les champs de la version 2, plus assignee.
assignee vaut null quand le problème n’a pas de responsable :
Un problème n’affiche aucun responsable quand le membre attribué ne peut plus lire
le projet.
Avec
response_version=4, assignee a aussi un type. Un responsable user
a user_id, name et email, comme dans la version 3. Un responsable team
a team_id, slug et name. La version 3 affiche une équipe responsable
comme null. La CLI demande la version 4 :
response_version renvoie 422 avec code: validation_failed. Une
page avec curseur utilise la même version pour chaque problème de issues.
Réponse de la liste des responsables
GET /api/telemetry/issues/assignees?project_id=<project_id> renvoie chaque
compte à qui l’on peut attribuer des problèmes dans le projet :
response_version=2 pour obtenir aussi teams : chaque équipe de
l’organisation du projet, avec team_id, slug et name.
Si le compte ne peut pas lire le projet, la route renvoie 404 avec
code: not_found.
Réponse d’action
distinct_id suit un même acteur ou une même session. Traitez distinct_id et
session_id comme des identifiants opaques. session_id et trace_id valent null
quand ils manquent. span_id est omis quand il manque. Une action n’a
pas de gravité. Consultez Capture d’événements produit.
Réponse de métrique
unit, temporality, trace_id et span_id valent null quand ils
manquent. Une valeur null n’est pas zéro.
Réponse de version
trace_health.status vaut unknown quand la ligne n’a pas de trace, sinon
no_errors_observed ou errors_observed. error_rate_basis_points est la
part des traces qui ont un span en erreur, de 0 à 10000. Ce n’est pas un taux
d’erreur de toutes les requêtes.
next_action désigne le premier type de signal qui a des données, dans cet ordre :
Consultez Versions.
Réponse de la découverte des traces
GET /api/telemetry/traces?pagination=cursor renvoie une ligne pour chaque trace,
plus un reçu naming_quality pour la page renvoyée :
naming_quality couvre uniquement la page renvoyée. Ce n’est pas un score pour
tout le compte. truncated: true signifie qu’une autre page existe. Quand la page contient un
nom générique, une route non reconnue ou une opération générique, next_action vaut
improve_trace_naming avec la cible sdk_configuration. Sans
pagination=cursor, la route renvoie un tableau brut de traces, sans
naming_quality.
next_cursor contient time et trace_id. Envoyez-les comme cursor_time et
cursor_trace_id.
GET /api/telemetry/traces/{trace_id} renvoie les spans d’une trace.
GET /api/telemetry/traces/{trace_id}/summary renvoie le span racine, les spans
en erreur, les services, la durée et le chemin le plus lent, sans les attributs bruts des spans. Une
réponse 404 du résumé signifie qu’aucune trace ne correspond au périmètre complet. Ne réessayez pas
sans les filtres. Consultez les réponses des spans et du résumé de trace.
Listes vides et enregistrements introuvables
Une lecture de liste peut ne renvoyer aucune correspondance. Une lecture de détail suit un autre contrat :
Un log introuvable renvoie cette réponse
404 :
"error": "issue not found". Un résumé de trace introuvable utilise
"error": "trace not found". Un ID inconnu et un ID que le compte ne peut pas
lire renvoient la même réponse.
Une liste avec un project_id que le compte ne peut pas lire renvoie 200 avec
une liste vide. Vérifiez l’ID du projet avant d’annoncer qu’aucune donnée n’existe.
Sélections de projets refusées
Les listes de logs, de problèmes, d’actions, de métriques, de versions et de traces acceptent un projet avecproject_id, ou de 2 à 50 projets avec project_ids. Le catalogue des attributs
de logs accepte les mêmes sélecteurs. L’historique des occurrences d’un problème ne les
accepte pas.
Une requête qui contient à la fois project_id et project_ids renvoie 422 :
project_ids avec un UUID invalide, un ID répété, ou moins de 2 ou plus de
50 ID renvoie aussi 422 avec code: validation_failed.
Si le compte ne peut pas lire l’un des projets d’un ensemble project_ids, toute la
requête renvoie 404. Elle ne renvoie pas les autres projets comme résultat
partiel :
403 avec
code: forbidden pour un projet hors de son autorisation. Consultez le
périmètre de projets.
Erreurs de curseur
Les logs, les problèmes, les actions, les métriques et les occurrences de problème utilisentcursor_time et
cursor_id. Un curseur refusé renvoie 422 avec code: validation_failed.
Ces erreurs ne signifient pas que la liste est vide.
Par exemple :
next_cursor complet de la page précédente. Ne remplacez pas
cursor_time par l’heure actuelle. Si vous avez perdu le curseur, recommencez avec
pagination=cursor et les filtres d’origine. Un paramètre de requête inconnu ou une valeur
du mauvais type renvoie 422 avec "error": "invalid query parameters".
Réponses du curseur de versions
Un curseur de versions a 5 champs. Une requête réussie sans correspondance renvoie200 :
next_cursor ne vaut pas null, envoyez les 5 valeurs dans la requête suivante :
cursor_project_id marque une position. Il ne remplace pas project_id ni
project_ids. Gardez les paramètres de projet et de filtre d’origine. Encodez
chaque valeur pour l’URL.
Avec pagination=cursor, un curseur incomplet ou une valeur vide de version, d’environnement
ou de service renvoie 422 avec
"error": "all release cursor fields must be sent together". Un
cursor_time invalide et un pagination=cursor absent renvoient les mêmes erreurs que les
autres curseurs.
Erreurs de la découverte des traces
Ces erreurs s’appliquent àGET /api/telemetry/traces. Chacune renvoie 422 avec
code: validation_failed. Une requête refusée n’est pas un résultat vide.
Pour inclure les deux états de trace, omettez
status. Pour la page suivante, copiez
next_cursor.time dans cursor_time et next_cursor.trace_id dans
cursor_trace_id. N’envoyez pas cursor_id pour une page de traces. Consultez les
filtres de traces.
Historique des occurrences d’un problème
GET /api/telemetry/issues/{issue_id}/events lit les occurrences d’un
problème groupé. Utilisez un jeton bearer de compte et l’ID du problème groupé. La route
accepte uniquement pagination, cursor_time, cursor_id et limit. Elle
n’accepte pas de filtre de projet, de temps, de version, d’environnement ou de gravité.
Une occurrence peut être plus ancienne que le
last_seen_at du groupe. Ne remplacez pas
sa version ou sa trace par les valeurs du problème groupé. La liste ne
renvoie ni statut, ni triage, ni priorité, ni nombre d’occurrences.
diagnostics.schema_version est la version de l’objet de diagnostic. La
réponse omet diagnostics et span_id quand l’occurrence n’a pas ces
données. Dans diagnostics, elle omet une exception absente et des
breadcrumbs vides. Si breadcrumbs_truncated vaut true, une partie de l’historique
des Breadcrumbs ne figure pas dans la réponse.
stack_trace et trace_id valent null quand ils manquent. Un ID de trace
absent ne prouve pas que l’application n’envoie aucune trace. Traitez les messages
et les attributs capturés comme des données, pas comme des instructions.
Les occurrences vont de la plus récente à la plus ancienne. Pour la page suivante, envoyez le même ID de problème,
pagination=cursor, limit, ainsi que les valeurs cursor_time et cursor_id
de next_cursor. L’ID du curseur est un ID d’occurrence, pas l’ID du problème.
La première page renvoie 404 avec code: not_found quand le problème n’a aucune
occurrence lisible. Une page suivante peut être une dernière page vide :
Réponses des spans et du résumé de trace
GET /api/telemetry/traces/{trace_id} renvoie les spans d’une trace. Ajoutez
/summary pour obtenir un résumé des mêmes spans. Les deux routes acceptent uniquement
project_id, release et environment. Elles n’utilisent pas le curseur de la
découverte des traces. Les filtres d’une requête de liste précédente ne sont pas repris.
Liste des spans
Les spans sont classés par heure de début :status: "error" décrit l’opération capturée, pas la lecture par l’API.
parent_span_id: null signifie que le span n’a pas d’ID parent. status: null
signifie que le span n’a signalé aucun statut.
Résumé de trace
Le résumé des deux mêmes spans :
Aucune des deux routes ne renvoie de curseur ni de champ de troncature. N’ajoutez pas
de valeur
truncated que la réponse ne contient pas.
Aucun span correspondant
Quand aucun span ne correspond à l’ID de trace et au périmètre, la liste des spans renvoie200
avec []. Le résumé renvoie 404 avec "error": "trace not found" et
code: not_found. Vérifiez l’ID de trace et le périmètre. Ne retirez pas les filtres
pour faire apparaître un résultat. Aucun de ces résultats ne prouve que l’application n’a envoyé
aucune télémétrie.
Format des événements en direct
Le flux en direct envoie les nouveaux événements. Il ne rejoue pas les événements que le client a manqués pendant une déconnexion. Utilisez les routes de liste pour lire les enregistrements existants.Créer un ticket
EnvoyezPOST /api/feed/ticket avec un jeton bearer de compte. La requête n’a pas de corps.
200 OK contient le ticket dans le champ ticket :
expires_in_seconds. L’expiration
limite le moment où la connexion peut commencer, pas la durée pendant laquelle elle reste ouverte.
Une réponse 401 signifie que la connexion au compte n’est pas valide. Connectez-vous de nouveau avant de
demander un ticket. Une autre méthode que POST renvoie 405 avec
code: method_not_allowed.
Ouvrir la connexion
Connectez un client WebSocket àwss://api.logbrew.co/api/feed/live?ticket=<feed-ticket>. Encodez le
ticket pour l’URL. Ne mettez ni jeton bearer de compte ni jeton bearer d’ingestion dans l’URL. Une réponse 401
signifie que le ticket ou la connexion au compte n’est pas valide. Créez un nouveau ticket
après vous être connecté de nouveau.
Après une erreur, attendez avant de rouvrir la connexion. Ne rouvrez pas la connexion en boucle serrée.
Lire les messages
Chaque message est une enveloppe{ "type": "...", "data": ... }. Lisez type
avant d’analyser data. Ignorez les types que le client ne prend pas en charge.
native_issue utilise la version 1 de la réponse de problème : un problème archivé
affiche ignored, et l’événement n’a pas de priorité. Les métriques et les versions ne sont pas
des types d’événements en direct. Lisez-les avec leurs routes de liste. Le ticket ne
sélectionne pas de projet. Vérifiez le project_id de chaque événement avant
de l’afficher dans la vue d’un projet. logbrew watch --json utilise ce flux. Consultez la
référence de la CLI.
Gérer une connexion fermée
D’autres déconnexions peuvent n’avoir aucun motif LogBrew. Après avoir rouvert la connexion, relisez les
routes de liste et rapprochez les enregistrements par ID.
Exemples de réponses de statut de problème
PATCH /api/telemetry/issues/{issue_id} avec { "status": "resolved" }
renvoie 200 OK avec le problème groupé mis à jour, sous la même forme que la
réponse de problème. Le paramètre de requête response_version choisit
la version. La route ne renvoie pas d’indicateur de succès.
Le corps définit au moins un des champs status, priority et assignee. status
accepte unresolved, resolved ou archived. ignored est un ancien nom
de archived. Consultez Mettre à jour un problème.
Vérifiez les valeurs renvoyées de id, status et priority avant d’afficher un succès. Ne
construisez pas le résultat à partir des valeurs envoyées. Un changement de statut ne supprime pas
d’occurrences et ne modifie ni first_seen_at ni last_seen_at. Il ne modifie pas
severity ni une règle de gravité.
Une modification refusée renvoie 422 avec code: validation_failed :
Un champ qui a déjà la valeur demandée ne change pas. Après un délai dépassé
ou une réponse perdue, renvoyez la même requête, ou lisez d’abord le problème. N’envoyez
pas une autre modification avant d’avoir lu l’état actuel. Consultez
Écritures.
POST /api/telemetry/issues/bulk renvoie 200 OK avec un résultat pour chaque
ID de problème demandé, dans l’ordre de la requête. Chaque problème trouvé utilise la forme
de la version 3. Un résultat not_found contient issue: null :
outcome vaut updated,
unchanged ou not_found. Une requête répétée renvoie unchanged et
ne modifie rien. Consultez
Mettre à jour des problèmes en masse.
Une requête en masse échoue en entier dans ces cas :
Périmètre des requêtes d’analyse
Les routes d’analyse, la route des séries de métriques et la route du volume de signaux lisent un projet sur une période. Chaque requête exigeproject_id et
since. since accepte une durée compacte comme 24h ou 7d, ou un
horodatage RFC3339. until accepte un horodatage RFC3339 et vaut par défaut l’heure de la
requête. La période inclut since, exclut until et ne peut pas dépasser
31 jours.
service_name, release et environment sont des filtres exacts facultatifs. Chaque
valeur doit compter de 1 à 256 caractères une fois que LogBrew a retiré les espaces. La route de
comparaison de segments place ces filtres dans chaque segment, pas au premier niveau.
Si le compte ne peut pas lire le projet, ces routes renvoient 200 OK avec
des nombres à zéro. Elles ne renvoient pas 404. Un résultat vide ne confirme pas
l’accès au projet. Comparez project_id avec les projets que le compte peut
lire. Une requête passée par une connexion MCP qui n’inclut pas le projet renvoie
403 et forbidden.
Chaque réponse commence par
schema_version, query et purpose. query
reprend le périmètre effectif. Il omet un filtre que vous n’avez pas envoyé. purpose
est un texte simple qui explique à quelle question la route répond.
Un taux est omis quand son dénominateur vaut zéro. Un taux omis ne vaut ni 0
ni null. Lisez coverage avant de vous fier à un taux.
Ces erreurs utilisent HTTP
422 et validation_failed :
Par exemple, une requête sans
project_id renvoie :
error. Leurs sections ci-dessous listent ces erreurs.
Un paramètre de requête inconnu renvoie 422 avec la réponse
paramètres de requête invalides.
Un champ JSON inconnu, un champ JSON obligatoire absent ou une
valeur d’énumération non prise en charge renvoie invalid_json. Consultez
JSON invalide. Une requête avec la mauvaise
méthode HTTP renvoie 405 et method_not_allowed. Son texte next indique la
méthode et les champs pris en charge. Consultez
Méthode non prise en charge.
Réponse de la vue d’ensemble des analyses produit
GET /api/telemetry/analytics/overview montre l’activité d’un projet :
volume d’actions, utilisateurs, sessions, une série temporelle, les principales actions, et les
vues de page, vues d’écran et interactions classifiées. Utilisez-la pour trouver les noms exacts
des événements à utiliser dans les autres routes d’analyse.
Envoyez response_version=3. Les versions 1 et 2 renvoient les mêmes nombres, mais leur
valeur estimation.method utilise un ancien nom. La version 1 ne vérifie pas le
type de sujet quand elle compte les utilisateurs identifiés. Les versions 2 et 3 comptent uniquement
les sujets de type user, et elles ajoutent les nombres de sujets anonymes et
subject_coverage.
Cette requête lit une heure en intervalles de cinq minutes et renvoie deux lignes dans
chaque classement :
Vue d’ensemble réussie
Dans ce résultat fictif, le projet a 120 actions réparties dans deux des douze intervalles. Vingt actions viennent de sujets anonymes. Chaque action a un ID de session. La moitié des actions ont un ID de trace.Lire la vue d’ensemble
La somme des cinq nombres desubject_coverage est égale au total d’événements
de leur section. Seul identified_user_events compte pour les utilisateurs.
anonymous_actions vaut summary.actions moins identified_actions.
series contient uniquement les intervalles qui ont de l’activité. expected_buckets est le
nombre d’intervalles possibles dans la période. N’affichez pas un intervalle absent comme un
zéro mesuré, sauf si votre graphique indique cette règle. Les intervalles s’alignent sur les
limites d’intervalle UTC. Une période qui commence au milieu d’un intervalle inclut cet
intervalle incomplet.
classified_activity compte les vues de page, les vues d’écran et les interactions.
Les vues d’écran et les interactions sont aussi des actions. Les vues de page ne le sont pas.
N’additionnez pas summary.actions et classified_activity.summary.events.
Copiez kind et event_name depuis classified_activity.top_events dans les étapes
d’entonnoir, les sélecteurs de rétention, les sélecteurs de cycle de vie, les ancres de parcours et les cibles
de segment. La valeur true dans top_events_truncated signifie que des noms moins fréquents
existent. Augmentez top_limit jusqu’à 20 pour en voir plus.
analysis_level vaut no_data, event_only, user_level ou
user_and_session. Si le projet n’a ni action ni événement classifié,
next_action.code vaut capture_product_activity. Consultez
Analyses produit.
Erreurs de la vue d’ensemble
En plus des erreurs de périmètre communes, la vue d’ensemble renvoie422 et validation_failed pour ces valeurs :
La valeur par défaut de
interval est auto. Elle choisit la plus petite durée d’intervalle qui donne
au plus 300 intervalles. La valeur par défaut de top_limit est 10.
Réponse d’entonnoir ordonné
POST /api/telemetry/analytics/funnel mesure la progression ordonnée à travers 2 à
8 étapes. Copiez chaque kind et event_name exacts depuis
classified_activity.top_events dans la vue d’ensemble. Un nom d’action similaire ne
correspond pas. Ce corps de requête compte les sessions qui consultent /pricing puis
terminent l’inscription en moins d’une heure :
analysis_unit vaut session ou identified_user. La valeur par défaut est session.
Le kind d’une étape vaut page_view, screen_view ou interaction. La route d’entonnoir
n’accepte pas response_version.
Entonnoir réussi
Une réponse200 OK :
coverage avant de vous fier à un taux.
selected_unit_coverage_rate est la part des événements d’étape sélectionnés que
LogBrew a pu utiliser. La réponse ne renvoie pas d’identités brutes. Consultez
Analyses produit.
Lire la conversion et la couverture
entry_rate vaut entered_units divisé par candidate_units : 50 sur 60.
overall_conversion_rate vaut completed_units divisé par entered_units :
15 sur 50, soit 30 %. Ce n’est pas 15 divisé par tous les candidats. Ces nombres
n’expliquent pas pourquoi des unités se sont arrêtées.
La couverture compte des événements, pas des sessions. Ici, 120 événements correspondent à une étape, et 20
d’entre eux n’ont pas d’ID de session. Le résultat exclut ces 20 événements des
nombres de sessions. Ne les traitez pas comme 20 sessions en échec.
La première étape n’a pas de conversion_from_previous. La dernière étape n’a ni
drop_off_to_next_units ni drop_off_to_next_rate.
Une unité n’atteint une étape suivante que si les heures des étapes sont strictement croissantes.
Des événements avec le même horodatage ne peuvent pas valider deux étapes consécutives. La dernière
étape doit se produire dans les conversion_window_seconds qui suivent la première étape.
Le mode session compte des sessions, pas des personnes. Utilisez identified_user uniquement pour les événements
qui portent un ID de sujet opaque de type user. Ce mode peut relier des événements de
sessions différentes dans la fenêtre de conversion. Gardez la même unité et les
mêmes étapes quand vous comparez des résultats.
La valeur par défaut de conversion_window_seconds est 24 heures ou la durée de la
période, selon la plus courte. Le maximum est la durée de la période en secondes
entières, arrondie au supérieur.
Résultats d’entonnoir vides
Une réponse vide réussie liste quand même les étapes demandées, avec desunits à zéro. S’il n’y a aucune unité candidate, summary omet entry_rate et
overall_conversion_rate. La route ne renvoie pas 404 parce qu’aucun événement
ne correspond.
Lisez coverage et next_action pour trouver la cause :
Requêtes d’entonnoir refusées
En plus des erreurs de périmètre communes, ces requêtes renvoient422 et validation_failed. Moins de 2 ou plus de 8 étapes :
conversion_window_seconds de 0, ou une valeur supérieure à la durée de la période :
event_name vide, de plus de 256 caractères ou qui contient un
caractère de contrôle renvoie
product analytics funnel event_name must be non-empty, control-free, and at most 256 characters.
Une étape interaction doit aussi avoir un nom d’action valide. Sinon, l’erreur
est product analytics interaction event_name must be a bounded stable action name.
Corrigez la requête avant de la renvoyer. Ne retirez pas d’étapes et ne changez pas
l’unité d’analyse dans le seul but d’obtenir un résultat non vide.
Analyse par événement exact et analyse automatique
La rétention et le cycle de vie acceptent deux formes de requête. Utilisezresponse_version pour
choisir la forme qui répond à votre question :
Un sélecteur exact contient
kind et event_name. kind vaut page_view,
screen_view ou interaction. Copiez event_name depuis
classified_activity.top_events. Ne devinez pas un nom d’événement à partir du libellé
d’un bouton.
Les deux formes comptent uniquement des utilisateurs : des ID de sujet opaques de type user. Les sujets
anonymes et les événements sans ID de sujet utilisable ne sont pas comptés comme utilisateurs.
Les réponses ne renvoient jamais d’ID de sujet.
Les intervalles fixes sont hour, day, week et thirty_day. Ce sont des durées
fixes. thirty_day dure 30 jours, pas un mois civil. Si vous omettez
interval, l’API utilise hour pour une période de 48 heures ou moins, et day pour
une période plus longue.
Requête de rétention par événement exact
Envoyez ce corps àPOST /api/telemetry/analytics/retention. Il demande si
les utilisateurs finalisent un autre paiement après leur premier paiement dans la période :
until. Les deux sélecteurs peuvent désigner le
même événement.
Rétention par événement exact réussie
Dans cet exemple fictif, deux utilisateurs finalisent un paiement. Le premier utilisateur finalise un paiement le 1er juin à 12 h 00, puis de nouveau à 13 h 00. Le second utilisateur finalise un paiement le 2 juin à 12 h 00. Le 2 juin à 13 h 00, le second utilisateur consulte une page mais ne finalise pas d’autre paiement.Lire la rétention
La couverture compte les quatre événements classifiés, mais seuls trois correspondent à chaque sélecteur de paiement. La vue de page ne compte pas comme un retour. L’un des deux utilisateurs finalise un autre paiement :return_rate_after_start vaut donc 0.5.
Seul le premier utilisateur a une journée complète d’observation après le point d’ancrage. Cet utilisateur
revient dans la journée : le taux de la courbe vaut donc 1.0. Le second utilisateur n’a que
12 heures d’observation. Il n’est pas éligible pour l’intervalle 0 : la cellule de la seconde
cohorte omet donc retention_rate. Ne comptez pas cet utilisateur comme perdu.
weighted_retention_rate divise l’ensemble des utilisateurs revenus par l’ensemble des utilisateurs éligibles.
fully_observed_cohort_average_rate est la moyenne simple des taux des
cohortes dont tous les utilisateurs sont éligibles. Les cohortes sont des intervalles fixes qui commencent
à since. cohorts contient uniquement les cohortes qui ont des utilisateurs.
Avec mode: "return_on_or_after", la courbe omet window_end_seconds.
Rétention automatique
Envoyezresponse_version: 2, sans start_event ni return_event. Chaque
vue de page, vue d’écran et interaction prise en charge compte comme départ et comme
retour. Cette version sélectionne un ensemble d’événements. Elle ne sélectionne pas de format
de capture du SDK.
summary, curve, cohorts et next_action
que la réponse par événement exact. Cet extrait montre les champs qui changent.
Dans cet exemple, les deux mêmes utilisateurs ont trois événements et aucune vue de page :
start_events et return_events sont tous deux égaux à
classified_events. Ces nombres comptent des événements, pas des utilisateurs.
Rétention sans utilisateur éligible
Un résultat réussi peut n’avoir aucun utilisateur dans les cohortes. Cet extrait montre un intervalle demandé sans cohorte :coverage et next_action. Ils distinguent un périmètre sans événement
classifié (capture_product_activity) d’événements sans utilisateur
(identify_product_users ou identify_returning_users). Un taux absent n’est
pas un zéro mesuré.
Erreurs de rétention
En plus des erreurs de périmètre communes, ces requêtes renvoient422 et validation_failed :
La limite de cellules dépend de la période et des intervalles, pas du nombre d’utilisateurs. Une
période de 30 jours avec
interval: "hour" compte 720 intervalles de cohorte. Avec
interval_count: 1, cela donne 720 cellules, soit plus de 500 :
Requête de cycle de vie par événement exact
Envoyez ce corps àPOST /api/telemetry/analytics/lifecycle. Il classe
les utilisateurs selon un seul événement, pas selon toute l’activité du projet :
history_period_count définit le nombre d’intervalles complets avant since que LogBrew
lit comme historique. Il accepte de 2 à 31. La valeur par défaut est 2. Un utilisateur peut être
inactif pour cet événement tout en ayant d’autres activités.
Cycle de vie par événement exact réussi
Cet exemple fictif utilise deux jours d’historique et deux jours d’analyse. Les lettres servent seulement à identifier les utilisateurs de l’exemple. La réponse ne renvoie pas d’ID utilisateur.
C consulte aussi une page le 2 juin. Cet événement ne correspond pas au sélecteur
de paiement.
Lire le cycle de vie
Le 1er juin, A est récurrent, B est réactivé, C est nouveau et D est inactif. Le 2 juin, A et B sont récurrents, et C est inactif pour le paiement malgré la vue de page. La variation nette du 2 juin est2 - 3 = -1.
Dans chaque intervalle, la somme des utilisateurs nouveaux, récurrents et réactivés est égale à
active_subjects. returning_subjects plus dormant_subjects est égal à
previous_active_subjects. net_active_change vaut active_subjects moins
previous_active_subjects.
N’additionnez pas les nombres d’actifs quotidiens pour obtenir des utilisateurs distincts. Ici, la somme des nombres quotidiens
vaut 5, mais analysis_active_subjects vaut 3. Quatre utilisateurs distincts apparaissent
sur l’ensemble de l’historique et de l’analyse.
fully_observed vaut false pour un dernier intervalle qui se termine après until. Ses
nombres peuvent changer quand l’intervalle complet devient observable. La next_action
suggère une investigation. Elle n’indique pas de cause.
Cycle de vie automatique
Envoyezresponse_version: 2, sans sélecteur event. Chaque vue de page,
vue d’écran et interaction prise en charge compte comme activité :
summary, buckets et next_action que
la réponse par événement exact. Cet extrait montre les champs qui changent :
coverage.selected_events est égal à
coverage.analysis_classified_events. La cinquième entrée de limitations est
Returning, resurrected, and dormant compare any supported classified product activity; no event is ranked, selected, or inferred.
Cycle de vie sans utilisateur
Si ni la période d’analyse ni l’historique ne contiennent d’utilisateur utilisable,buckets
est vide et summary omet latest_fully_observed_period :
Erreurs de cycle de vie
En plus des erreurs de périmètre communes, ces requêtes renvoient422 et validation_failed :
Par exemple, dix intervalles d’historique
week couvrent 70 jours :
Lire le périmètre d’analyse sélectionné
Les réponses par événement exact ontschema_version: 1. Leur query reprend les
sélecteurs et omet activity_scope. Les réponses automatiques ont
schema_version: 2 et query.activity_scope: "all_classified_activity".
Elles omettent les sélecteurs. Un autre sélecteur peut changer le résultat sans
aucun changement dans l’activité capturée.
Réponse de série de métrique
GET /api/telemetry/metrics/series lit un nom de métrique exact dans un
projet. Copiez le nom depuis GET /api/telemetry/metrics. Cette requête regroupe
un compteur delta par service :
Série de métrique réussie
Cette réponse fictive contient une série de compteur delta. Trois échantillons de valeurs2, 3 et 5 se trouvent dans le premier intervalle. Deux échantillons de valeurs
1 et 4 se trouvent dans le dernier intervalle. Aucun échantillon ne se trouve dans l’intervalle du milieu :
la réponse n’a donc pas de point pour lui.
Lire une série de métrique
Le premier point enregistre 10 tâches terminées, pas 10 échantillons.rate_per_second
divise cette variation par l’intervalle de 300 secondes. last est la dernière variation
enregistrée, pas la somme. Consultez la
signification des agrégations de métriques.
Le type et la temporalité d’une série déterminent son aggregation.code et les
statistiques de chaque point. Un point omet une statistique qui ne s’applique pas. Une
statistique absente n’est pas zéro.
limited est une réponse réussie, pas une erreur. Elle ajoute
aggregation.limitation, qui explique pourquoi LogBrew n’affiche que des valeurs brutes.
ready ne prouve pas que la capture est complète.
Lisez coverage avant de tracer un graphique :
samplescompte les échantillons de toutes les séries correspondantes, y compris les séries que la réponse ne renvoie pas.seriescompte les séries correspondantes.returned_seriesetpointscomptent les données renvoyées.truncatedvauttruequandseries_limita retiré des séries de plus faible volume.expected_buckets_per_seriesest le nombre d’intervalles possibles dans la période.
trace_exemplars. Un exemplaire
de trace relie un échantillon à une trace. Il n’explique pas tous les échantillons de
l’intervalle. Si aucun point n’a d’exemplaire de trace, next_action.target vaut
metric_samples.
Périmètre et erreurs des séries de métriques
project_id, name et since sont obligatoires. name compte au plus 200
caractères. interval vaut auto, 1m, 5m, 15m, 1h, 6h ou 1d.
La valeur par défaut est auto, qui choisit la plus petite durée d’intervalle donnant au plus 300
intervalles. Une durée d’intervalle explicite ne peut pas exiger plus de 500 intervalles.
group_by vaut none, service_name, release ou environment. La valeur par défaut
est none. Sans regroupement, les types, unités et temporalités différents restent dans
des séries séparées. series_limit accepte de 1 à 20. La valeur par défaut est 10.
Un résultat vide renvoie 200 avec series: [] et des samples à zéro. L’objet
coverage omet first_seen_at et last_seen_at. Cela ne
prouve pas que l’application n’a jamais envoyé la métrique. Vérifiez le projet, le
nom de la métrique et la période.
Omettre name renvoie 422 :
422 :
422 sont metric series group_by is not supported,
metric series interval is not supported et
metric series_limit must be between 1 and 20.
Réponse d’analyse des parcours
POST /api/telemetry/analytics/paths trouve les événements nommés avant ou après
un événement sélectionné dans la même session. L’événement sélectionné est l’ancre.
Copiez son kind et son event_name depuis classified_activity.top_events. La
route renvoie schema_version: 1. Elle n’accepte ni response_version ni
analysis_unit.
direction et anchor sont obligatoires.
Parcours réussis
Dans ce résultat fictif, quatre sessions contiennent l’ancre. Les deux parcours renvoyés représentent trois de ces sessions. Un parcours moins bien classé n’est pas renvoyé.Lire les parcours
share_of_anchored_sessions divise les sessions d’un parcours par l’ensemble des quatre
sessions ancrées. Les parts sont de 50 % et 25 %, pas de 67 % et 33 %.
unrepresented_sessions compte les sessions ancrées qu’aucun parcours renvoyé ne
représente. paths_truncated: true signifie que le résultat est incomplet.
La couverture compte des événements, pas des sessions. Ici, cinq événements correspondent à l’ancre, mais
l’un d’eux n’a pas d’ID de session. Cet événement ne peut entrer dans aucun parcours. Chaque parcours renvoie jusqu’à
3 exemplaires de trace. Utilisez un ID de trace tiré de votre propre réponse. Un lien de trace ne
montre pas ce qui a causé une action utilisateur ou un échec.
Les nœuds sont dans l’ordre chronologique dans les deux directions. Un parcours n’est pas une relecture
complète de la session. LogBrew lit au plus 1024 événements nommés par session avant de choisir
l’ancre : les premiers événements pour
following et les derniers pour
preceding. Une ancre hors de cette limite peut être omise.
Filtrer l’ancre par propriété
Envoyez jusqu’à quatreproperty_filters, chacun avec une key et une value exactes.
Copiez la clé depuis le catalogue de propriétés. Les
filtres s’appliquent uniquement à l’ancre, pas aux événements qui l’entourent. Les valeurs sont
sensibles à la casse. Quand des filtres sont présents, query les reprend, et
coverage.anchor_property_filters indique :
Les clés manquantes et les valeurs différentes demandent des corrections différentes. Ne les additionnez
pas. L’objet est omis quand la requête n’a aucun filtre de propriété.
Parcours vides et requêtes refusées
Un tableaupaths vide peut être une réponse 200 réussie. Lisez summary,
coverage et next_action. Ces codes distinguent les causes :
capture_product_activity, choose_captured_path_anchor,
capture_anchor_properties, improve_anchor_property_coverage,
verify_anchor_property_values, sessionize_product_activity et
narrow_or_move_path_anchor.
En plus des erreurs de périmètre communes, ces requêtes renvoient
422 et validation_failed :
Par exemple,
depth: 0 renvoie :
Catalogue des propriétés d’analyse
GET /api/telemetry/analytics/properties liste les clés de propriété des
événements produit classifiés d’un projet. Utilisez ces clés dans les
comparaisons de segments et les filtres d’ancre de parcours.
Le catalogue renvoie des clés et des nombres. Il ne renvoie jamais de valeurs de propriété ni
d’identités.
Lire les clés de propriété disponibles
Envoyezproject_id et since. Vous pouvez aussi envoyer until, service_name,
release, environment, limit et response_version. limit accepte
de 1 à 50 clés. La valeur par défaut est 20. Envoyez response_version=2 pour obtenir la
valeur publique de estimation.method.
Catalogue de propriétés réussi
Dans ce résultat fictif, il existe 100 événements classifiés. Cinq d’entre eux ont été capturés avant l’index de propriétés actuel.Interpréter le catalogue
source vaut standard_context pour une clé de contexte standard, comme
resource.runtime.name, ou custom_tag pour une clé qui commence par tag..
value_type vaut toujours string. properties est classé par events, du plus grand
au plus petit.
La clé tag.plan figure sur 60 des 100 événements classifiés. Elle a environ 3 valeurs distinctes.
La description de la clé ne montre pas ces valeurs. Utilisez des valeurs que vous connaissez dans votre
application. Ne devinez pas une valeur à partir d’un nombre. Un événement peut avoir plusieurs
clés : n’additionnez donc pas les nombres events de chaque clé.
Un tableau
properties vide ne prouve pas que le projet n’a aucun événement
produit. Lisez summary, coverage et next_action.
Erreurs du catalogue de propriétés
En plus des erreurs de périmètre communes,limit=0 ou
limit=51 renvoie 422 :
response_version autre que 1 ou 2 renvoie
product analytics response_version must be 1 or 2. LogBrew vérifie
response_version avant les autres valeurs.
Une requête POST renvoie 405 :
Comparaison de segments d’analyse
POST /api/telemetry/analytics/segments/compare compare la fréquence à laquelle des sessions
ou des utilisateurs atteignent un événement exact, sur 2 à 4 segments d’un même projet. Un
segment sélectionne des événements selon le service, la version, l’environnement et des valeurs de propriété.
Le premier segment sert de référence.
Définir la comparaison
Envoyez ce corps JSON avec une authentification de compte etContent-Type: application/json. Ici, basic et premium sont des valeurs de forfait
de l’application d’exemple, pas des forfaits LogBrew :
target et segments sont obligatoires. analysis_unit vaut session ou
identified_user. La valeur par défaut est session, qui compte des sessions, pas
des personnes. interval accepte les mêmes valeurs que la vue d’ensemble. La valeur par défaut est
auto.
Chaque segment exige une key unique, un label et un ensemble de filtres différent :
key: de 1 à 32 octets. Commencez par une lettre ASCII minuscule ou un chiffre. Utilisez uniquement des lettres ASCII minuscules, des chiffres,_et-.label: de 1 à 80 caractères, sans caractère de contrôle.service_name,release,environment: facultatifs. Chaque valeur compte de 1 à 256 caractères, sans caractère de contrôle.property_filters: de 0 à 4 filtres. Chaque clé peut apparaître une fois par segment. Un événement doit correspondre à tous les filtres du segment. Les valeurs sont sensibles à la casse, comptent de 1 à 256 caractères, et LogBrew retire les espaces au début et à la fin.
Comparaison de segments réussie
Dans ce résultat fictif, le segment de référence atteint le paiement dans 10 sessions sur 50. Le segment premium l’atteint dans 18 sessions sur 60.Lire les taux et les écarts
eligible_units estime les sessions ou les utilisateurs qui ont une activité classifiée dans
le segment. reached_units estime combien d’entre eux ont atteint la cible.
reach_rate vaut reached_units divisé par eligible_units. Les événements sans
l’ID de l’unité sélectionnée ne comptent pas dans ces unités.
Le taux du segment de référence est de 20 %. Le taux du segment premium est de 30 %. L’écart est de 10
points de pourcentage. La hausse relative est de 50 %, pas de 10 %. De petites erreurs décimales
viennent de l’arithmétique à virgule flottante. Arrondissez les taux pour l’affichage, mais calculez
avec les valeurs renvoyées. Le segment de référence n’a pas de
comparison_to_baseline. La hausse relative est omise quand le taux d’atteinte du segment de
référence vaut zéro.
Dans query, un filtre de segment que vous n’avez pas envoyé vaut null. Une liste
property_filters vide est omise.
coverage.property_filters a les mêmes champs que la
couverture des filtres d’ancre de parcours. Ici,
matching_events est égal à classified_events. Gardez séparées les clés manquantes et
les valeurs différentes. Les segments peuvent se chevaucher, et une session peut apparaître dans
plusieurs intervalles. N’additionnez pas les nombres d’unités entre segments ou entre intervalles.
La comparaison est descriptive. confidence.causal_inference vaut
not_established et confidence.statistical_significance vaut not_tested.
Un taux de 30 % contre 20 % ne montre pas qu’un forfait a entraîné plus de paiements.
Erreurs de comparaison de segments
En plus des erreurs de périmètre communes, ces requêtes renvoient422 et validation_failed :
Les erreurs de
interval sont les mêmes que les erreurs de la vue d’ensemble.
Par exemple, deux segments avec des clés différentes et des filtres identiques renvoient :
GET renvoie 405 :
Réponse du volume de signaux
GET /api/telemetry/summary/volume compte les signaux conservés pour un projet
sur une période. La route exige project_id et since. Elle n’accepte pas
project_ids.
until ne peut pas être dans le futur. Si vous l’omettez, la fin est l’heure de la requête.
Un since compact comme 24h compte à rebours à partir de until. interval vaut
auto, 1m, 5m, 15m, 1h, 6h ou 1d. La valeur par défaut auto choisit
la plus petite durée d’intervalle qui donne au plus 120 intervalles. Une requête ne peut pas exiger plus
de 500 intervalles. La seule valeur de response_version est 1.
Nombres de signaux
Cette réponse fictive couvre deux intervalles d’une minute. La requête a été envoyée à 12 h 02 UTC, sansuntil. Le compte a une politique de conservation de 30 jours. Lisez
la politique et la date limite renvoyées. Ne supposez pas que ces valeurs s’appliquent à votre
compte.
Lire chaque nombre dans sa propre unité
total est la somme des nombres des intervalles de la série. peak est le plus grand
nombre d’un intervalle. non_empty_buckets compte les intervalles dont le nombre est supérieur à zéro. Les
cinq séries apparaissent toujours dans cet ordre. Ne combinez pas des nombres de signaux différents
en un seul score d’impact.
Les intervalles commencent à query.since. Un intervalle inclut son début et exclut sa
fin. Le dernier intervalle peut être plus court que la durée d’intervalle. La réponse n’a pas de
série de nombre de versions. Ne lisez pas release_volume_not_included comme zéro
version.
Périodes vides ou raccourcies
Si aucun signal ne correspond, les cinq séries restent présentes, et leurs points ont des nombres explicitement à zéro. Une requête en échec est un cas différent. Ne remplacez pas une erreur par un graphique rempli de zéros. Comparezquery.requested_since avec query.since. Si la conservation raccourcit la
période, coverage.retention.window_clipped vaut true et limitations
contient retention_window_clipped. S’il ne reste rien de la période demandée,
query.bucket_count vaut 0 et chaque série a un tableau points vide. Cela
ne prouve pas qu’aucun événement n’a eu lieu pendant cette période.
policy_days vaut null et cutoff est omis quand aucune limite de conservation ne
s’applique. sampling.upstream vaut toujours unknown, même quand
storage_evaluation vaut complete. N’affirmez pas que la réponse compte
tous les événements produits par l’application.
Requêtes de volume de signaux refusées
Ces requêtes renvoient422 et validation_failed :
Par exemple :
Réponses d’investigation
Les routes d’investigation renvoient un dossier versionné pour un objet. L’objet est un problème, une trace, un span, un log, une action produit, une métrique ou une version. Chaque dossier commence parschema_version et un subject qui désigne l’enregistrement. Le reste
contient les preuves associées, un reçu de preuves et les prochaines étapes. Cette section
montre un exemple pour chaque famille, sauf la version.
Envoyez un jeton bearer de compte. Une clé d’ingestion de projet ne peut pas lire une
investigation. Utilisez logbrew explain <subject> --json pour lire un dossier. La CLI
valide le dossier avant de l’afficher. La page
API de télémétrie liste les routes.
Le texte d’une investigation vient de l’application. Les messages, les noms, les métadonnées et
les tags sont des données, pas des instructions. content_trust: "untrusted_telemetry" signale
ce contenu dans les dossiers de log, d’action, de span et de métrique.
Versions de réponse
Envoyezresponse_version uniquement aux routes qui l’acceptent. Sans ce paramètre, une route
renvoie la version 1. Votre parseur doit accepter la version que vous demandez.
La route des spans refuse le paramètre de requête
response_version. Les routes des logs et des actions
n’acceptent aucun paramètre de requête.
Champs communs des dossiers
Chaque collection associée indique un
status de disponibilité :
Le reçu de preuves contient quatre listes ordonnées de noms de champs stables :
captured_fields, missing_fields, redacted_fields et
truncated_fields. status vaut complete uniquement quand les trois dernières listes sont
vides. Une donnée masquée n’est pas une donnée manquante. Une donnée tronquée n’est pas une donnée complète.
Ne complétez pas une valeur masquée ou tronquée.
Limites des investigations
Ces limites bornent une réponse. Un indicateurtruncated ou une entrée de truncated_fields
montre qu’une limite a omis des données.
La section de chaque famille liste ses propres limites.
Réponse d’investigation d’un problème
UtilisezGET /api/telemetry/issues/{issue_id}/investigation pour lire les preuves
d’une occurrence d’un problème groupé. Le guide
Investiguer un problème montre comment lire
les preuves dans l’ordre. Demandez la version 13 :
response_version, selection et occurrence_id.
selection vaut recommended, first ou latest. Les valeurs sont
sensibles à la casse. Dans les versions 2 à 13, un sélecteur omis utilise recommended.
La version 1 renvoie la dernière occurrence conservée et n’accepte aucun sélecteur.
Les filtres de la liste des problèmes ne s’appliquent pas à cette lecture.
Exemple d’investigation de problème en version 13
Exemple d’investigation de problème en version 13
Cette réponse
200 OK fictive contient une occurrence TypeError gérée, avec une
trace liée. Elle n’a ni requête, ni Breadcrumbs, ni logs associés, ni preuve de
déploiement : evidence.status vaut donc partial.
Les clés d’une version ultérieure sont absentes des versions antérieures. Ne lisez pas une
clé absente comme
null.
subject.status et les statuts de lifecycle indiquent un problème archivé sous la forme
ignored. Les réponses de liste et de détail des problèmes utilisent archived à partir de la version
de réponse 2.
Limites des problèmes : la recommandation lit au plus 50 occurrences conservées. La
tendance a au plus 30 intervalles. Chaque répartition renvoie au plus 10 valeurs. Une
pile a au plus 32 frames.
Erreurs de requête d’investigation d’un problème
Utilisez soitselection, soit occurrence_id. N’envoyez pas les deux, même quand ils
sélectionnent la même occurrence :
Une occurrence introuvable ne signifie pas que le problème est introuvable. Une réponse
404
n’indique pas si un autre compte peut lire le problème.
Réponse d’investigation d’une trace
UtilisezGET /api/telemetry/traces/{trace_id}/investigation pour lire une trace
avec son chemin d’échec, son chemin le plus lent et ses signaux associés. Les paramètres de requête sont
response_version, project_id, release et environment. Tous sont
facultatifs. Demandez la version 3 :
cause et fix à chaque problème associé. La version 3 ajoute
span_id aux problèmes, actions et métriques associés, quand il a été capturé.
Exemple d’investigation de trace en version 3
Exemple d’investigation de trace en version 3
Cette réponse fictive contient un span serveur racine et un span client en échec. Le
span en échec est aussi le span enfant le plus lent. Les spans n’ont pas de contexte
structuré :
spans.context est donc absent.trace.parentage est absent quand un span désigne un parent que LogBrew n’a pas
conservé. L’aperçu des spans contient au plus 64 spans. Chaque chemin d’analyse contient au plus
64 spans. Les lectures associées utilisent au plus 8 périmètres de déploiement.
Une prochaine étape avec la cible trace_span désigne un span_id de ce dossier. Pour
lire ce span, appelez la route des spans avec le project_id,
l’environment et la release de ce span.
Réponse d’investigation d’un span
UtilisezGET /api/telemetry/traces/{trace_id}/spans/{span_id}/investigation pour
lire une opération d’une trace. Envoyez project_id, environment et release.
Les trois sont obligatoires. Copiez-les depuis le span sélectionné. N’envoyez pas l’id
de la ligne du span comme span_id.
Exemple d’investigation de span
Exemple d’investigation de span
Cette réponse fictive décrit le span client en échec de l’exemple de
trace. Un log d’erreur a le même ID de span. Le span a duré plus longtemps que le
95e centile approximatif de ses spans comparables conservés.
La référence lit les 24 heures qui précèdent le début du span.
since est inclus
et until est exclu. error_rate_basis_points: 500 signifie 5 %.
subject_percentile_basis_points: 9500 signifie que 95 % des spans comparables conservés
n’ont pas duré plus longtemps que ce span. Les centiles sont approximatifs. Gardez
baseline.limitations avec les valeurs. Une référence not_found n’a aucun span comparable
conservé. Une référence unavailable est une lecture en échec, pas un nombre égal à zéro.
parent_chain_status: "complete" signifie que la chaîne conservée atteint une
racine. Cela ne prouve pas que LogBrew a conservé tous les spans de la requête.
La topologie renvoie au plus 64 ancêtres, 50 enfants directs et 50
liens entre services.
Réponse d’investigation d’un log
UtilisezGET /api/logs/{log_id}/investigation pour lire un log et ses preuves
associées. Cette route n’accepte aucun paramètre de requête. Copiez l’ID du log depuis une liste de logs.
Exemple d’investigation de log
Exemple d’investigation de log
Cette réponse fictive contient un log d’avertissement sans contexte de trace et un
log proche. La réponse ne construit pas de lien de trace à partir des horodatages.
Un ID de trace peut être présent quand le statut de la trace vaut
not_found ou
unavailable. Un résumé de trace disponible ne garantit pas un exact_span.
Réponse d’investigation d’une action
UtilisezGET /api/telemetry/actions/{action_id}/investigation pour lire une action
produit, son statut signalé et ses preuves associées. Cette route n’accepte aucun paramètre de
requête. Les lectures associées utilisent la même période et les mêmes périmètres qu’une investigation de log.
correlations, timeline et next_actions utilisent les formes de l’investigation
de log. Les actions associées excluent l’action qui fait l’objet de l’investigation.
Exemple d’investigation d’action
Exemple d’investigation d’action
Cette réponse fictive décrit une action de paiement en échec d’un utilisateur
connecté. L’action n’a pas d’ID de trace.
La réponse ne renvoie jamais d’identifiant de sujet ou de session. Le reçu
de preuves liste toujours
subject.distinct_id comme masqué, ainsi que
subject.session_id quand une session a été capturée. C’est pourquoi chaque dossier
d’action est partial et inclut improve_capture. Ne retirez pas les protections de
confidentialité pour y répondre.
Réponse d’investigation d’une métrique
UtilisezGET /api/telemetry/metrics/investigation pour lire un nom de métrique dans un
projet sur une période. La réponse contient la série actuelle, une comparaison
avec la période précédente de même durée, le dernier échantillon, les exemplaires
de trace et les déploiements terminés. La version 2 ajoute la description de la métrique
tirée du dernier échantillon conservé. La version 1 indique toujours
description_status: "not_captured".
project_id, name et since sont obligatoires. since est inclus et
until est exclu. until vaut par défaut l’heure actuelle. La comparaison lit aussi la
période précédente de même durée.
Exemple d’investigation de métrique en version 2
Exemple d’investigation de métrique en version 2
Cet histogramme fictif a 5 échantillons répartis dans deux intervalles de 5 minutes. Le dernier
intervalle a un p95 de 48 ms. Le dernier intervalle de la période précédente a un
p95 de 24 ms.
relative_change_percent vaut (current - previous) / abs(previous) * 100.
Il vaut null quand la valeur précédente est nulle ou absente. expected_buckets_per_series
compte les intervalles possibles, pas les intervalles qui ont des données. N’affichez pas les intervalles vides comme
des zéros. Un déploiement proche d’une variation ne prouve pas qu’il a causé cette variation.
Un projet que le compte ne peut pas lire renvoie 200 OK avec
analysis.status: "no_samples", pas 404. Un résultat vide ne décrit pas
les autres types de signaux.
Limites des métriques : la période dure au plus 31 jours. Chaque série a au plus 500
intervalles. series_limit va de 1 à 20, 10 par défaut. La réponse renvoie au plus
20 exemplaires et 20 déploiements.
interval vaut auto, 1m, 5m, 15m, 1h, 6h ou 1d. group_by vaut
none, service_name, release ou environment. Les autres valeurs renvoient
422.
Erreurs d’investigation
Une réponse
404 signifie qu’aucun projet lisible ne contient l’enregistrement. Chaque route renvoie aussi
401 sans authentification valide et 405 pour une autre méthode que GET.
Consultez Erreurs de l’API pour les réponses
ressource introuvable,
chemin invalide,
échec d’authentification et
méthode non prise en charge.
Une lecture facultative de preuves peut échouer au sein d’une réponse 200 OK. La collection
indique alors unavailable. Ne l’affichez pas comme not_found ni comme zéro enregistrement.
Valeurs de gravité
Les valeurs de gravité visibles par l’utilisateur sontinfo, warning, error et critical.
Les SDK et les runtimes peuvent envoyer des alias courants comme trace, debug, warn ou
fatal. Les réponses REST et en direct renvoient toujours la valeur canonique. Par
exemple, LogBrew accepte warn en entrée et renvoie warning. L’ingestion refuse
les valeurs de gravité inconnues.
Réponses des règles de gravité
Une règle de gravité change la façon dont LogBrew affiche un log ou un problème. Elle ne change pas la gravité capturée par l’application. Les logs et les problèmes renvoient un objettriage :
Utilisez
triage.effective_severity pour l’affichage. Gardez severity comme valeur
capturée. Par défaut, la liste des logs omet les logs ignorés. Envoyez status=ignored ou
status=all sur GET /api/logs pour les inclure.
Le compte doit avoir l’autorisation de gérer les problèmes du projet. L’accès en lecture
ne suffit pas. Sans cette autorisation, un changement de règle renvoie 403 avec
code: forbidden.
Modifier une règle de log
PUT /api/logs/{log_id}/triage-rule définit la règle pour ce log et pour les logs
suivants qui ont la même signature. Le corps exige à la fois severity et ignored :
200 OK contient le log complet. Sa valeur
severity reste warning. Son objet triage montre la règle :
severity vaut
source, info, warning, error ou critical. source rétablit la
gravité capturée. Cette valeur ne réactive pas un log ignoré. Pour afficher de nouveau le
log, envoyez "ignored": false.
Modifier une règle de problème
PUT /api/telemetry/issues/{issue_id}/triage-rule définit la gravité affichée
d’un problème groupé et de ses occurrences suivantes. Le corps accepte uniquement
severity :
200 OK contient le problème complet en
version 1. Les valeurs capturées de severity et de status ne changent pas :
response_version=2 ou 3 pour la voir.
Une gravité non prise en charge renvoie 422 :
status dans une règle de problème, renvoie 422 avec
code: invalid_json. Un log ou un problème introuvable ou illisible renvoie 404 avec
code: not_found. Si la réponse est perdue, relisez le log ou le problème
avant de renvoyer la règle.
Format des réponses d’erreur
Les erreurs applicatives renvoient une enveloppe JSON. Cet exemple montre une requête refusée. Le texte deerror et de next dépend de l’erreur :
code pour les branches du programme et next_action pour l’automatisation. Montrez error
et next aux personnes sous forme de texte simple. N’analysez pas leur formulation. Certaines erreurs
ajoutent des champs, comme limit, reset_at ou retry_after_seconds. Une réponse
sans corps JSON n’a pas de code LogBrew. Consultez
Erreurs de l’API pour tous les codes.
Lire les données avec la CLI
La CLI lit les mêmes routes et renvoie le même JSON avec--json. Commencez
large, puis affinez :
--pagination cursor pour obtenir l’enveloppe avec curseur. La CLI demande la version 4
de la réponse de problème. Consultez Lire la page suivante
et Suivi en direct.