Skip to main content
Cette page montre un exemple pour chaque famille de réponses de l’API de télémétrie. Toutes les valeurs sont fictives. Pour les codes d’erreur et la reprise, consultez Erreurs de l’API.

Lire une réponse

Lisez chaque réponse dans cet ordre :
  1. Lisez le statut HTTP.
  2. Vérifiez que le corps a la forme définie par la route.
  3. Vérifiez que chaque project_id fait partie du périmètre de projets demandé.
  4. Conservez telles quelles les valeurs d’énumération canoniques et les identifiants.
  5. Suivez next_action uniquement si le client prend en charge son code et sa target.
  6. Traitez null, un champ omis et une liste vide comme des états différents.
Une réponse 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 :
  • release et environment.
  • 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, error et critical.
  • Des attributs utiles au débogage, sans secrets ni données personnelles inutiles.
Consultez Intégration du SDK et Contrôler les données capturées.

Réponse d’ingestion

Les SDK publics lisent la réponse de POST /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é renvoie 200 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 :
La réponse native n’a pas de champ 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éponse 401 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 :
Les autres valeurs de 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 et limit=1 :
Les logs contiennent 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 :
En 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 :
Cet exemple ne montre que certains champs. Une priorité dérivée vaut 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 :
Toute autre valeur de 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 :
Ajoutez 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

Chaque élément est un échantillon. N’utilisez pas le nombre d’échantillons comme un nombre d’événements ou d’utilisateurs. unit, temporality, trace_id et span_id valent null quand ils manquent. Une valeur null n’est pas zéro.

Réponse de version

Une ligne couvre un projet, une version, un environnement et un service. Ses nombres décrivent uniquement cette ligne. 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 :
Un problème introuvable utilise "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 avec project_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 :
Affichez l’erreur, pas une liste vide ni un nombre égal à zéro. Relisez la liste des projets. Ne retirez pas un projet sans le signaler, et ne réessayez pas sur tous les projets. Un identifiant délégué, comme une connexion MCP, renvoie 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 utilisent cursor_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 :
Copiez le 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 renvoie 200 :
Quand 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 première page avec une occurrence et un curseur de continuation :
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 :
Ne réutilisez pas un curseur pour un autre problème. Les erreurs de curseur s’appliquent à cette route.

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 renvoie 200 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

Envoyez POST /api/feed/ticket avec un jeton bearer de compte. La requête n’a pas de corps.
Une réponse 200 OK contient le ticket dans le champ ticket :
Le ticket est un identifiant de courte durée. Ne l’écrivez pas dans les logs et ne le mettez pas dans le prompt d’un agent. Ouvrez la connexion avant la fin de 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.
Un événement 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 :
Cet exemple ne montre que certains champs du problème. 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 exige project_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.

Erreurs de périmètre communes

Ces erreurs utilisent HTTP 422 et validation_failed : Par exemple, une requête sans project_id renvoie :
Les routes des séries de métriques et du volume de signaux appliquent les mêmes règles de périmètre, avec leur propre texte 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 de subject_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 renvoie 422 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éponse 200 OK :
Les taux sont des fractions de 0 à 1. Lisez 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 des units à 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 renvoient 422 et validation_failed. Moins de 2 ou plus de 8 étapes :
Un conversion_window_seconds de 0, ou une valeur supérieure à la durée de la période :
Un 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. Utilisez response_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 :
Le premier événement de départ correspondant dans la période sert de point d’ancrage à chaque utilisateur. Un retour doit se produire strictement après ce point d’ancrage et avant 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

Envoyez response_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.
La réponse a les mêmes formes 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 :
En mode automatique, 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 :
Lisez 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 renvoient 422 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 :
Pour utiliser la rétention automatique, retirez les deux sélecteurs. Ne modifiez pas le SDK pour corriger cette requête de lecture.

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 est 2 - 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

Envoyez response_version: 2, sans sélecteur event. Chaque vue de page, vue d’écran et interaction prise en charge compte comme activité :
La réponse a les mêmes formes summary, buckets et next_action que la réponse par événement exact. Cet extrait montre les champs qui changent :
En mode automatique, 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 :
Des utilisateurs qui n’apparaissent que dans l’historique peuvent quand même produire des intervalles avec des utilisateurs inactifs quand la période d’analyse n’a aucune activité.

Erreurs de cycle de vie

En plus des erreurs de périmètre communes, ces requêtes renvoient 422 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 ont schema_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 valeurs 2, 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 :
  • samples compte les échantillons de toutes les séries correspondantes, y compris les séries que la réponse ne renvoie pas.
  • series compte les séries correspondantes. returned_series et points comptent les données renvoyées.
  • truncated vaut true quand series_limit a retiré des séries de plus faible volume.
  • expected_buckets_per_series est le nombre d’intervalles possibles dans la période.
N’ajoutez pas de point pour un intervalle sans échantillon. N’insérez pas de zéro et ne copiez pas la valeur précédente. Chaque point renvoie jusqu’à 3 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 :
Des intervalles d’une minute sur sept jours renvoient 422 :
Les autres erreurs 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’à quatre property_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 tableau paths 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

Envoyez project_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 :
Une valeur de 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 et Content-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.
Un segment sans filtre sélectionne toute l’activité classifiée du projet sur la période. Les segments peuvent se chevaucher. Un label ou une clé différents ne rendent pas valides deux ensembles de filtres identiques.

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 renvoient 422 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 :
Un autre label ou un autre ordre des filtres de propriété ne change pas les événements sélectionnés. Un échec de validation n’est pas une preuve qu’aucun événement ne correspond. Une requête 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, sans until. 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. Comparez query.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 renvoient 422 et validation_failed : Par exemple :
Utilisez une durée d’intervalle plus large dans le même périmètre. Pour l’authentification et les autres échecs, consultez Erreurs de l’API.

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 par schema_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

Envoyez response_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 indicateur truncated 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

Utilisez GET /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 :
Les paramètres de requête sont 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.
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 soit selection, 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

Utilisez GET /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 :
La version 2 ajoute 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é.
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

Utilisez GET /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.
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

Utilisez GET /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.
La lecture peut renvoyer des preuves hors des filtres de la liste des logs. Les lectures associées utilisent le projet, l’environnement et la version du log, et les 5 minutes avant et après le log. Les logs proches utilisent aussi le même service. Ils n’ont pas besoin d’un ID de trace. Les lectures par trace exacte exigent l’ID de trace du log et peuvent inclure d’autres services. Le résumé de trace utilise le même ID de trace et le même périmètre, sans la période.
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

Utilisez GET /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.
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

Utilisez GET /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.
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 sont info, 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 objet triage : 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 :
Une réponse 200 OK contient le log complet. Sa valeur severity reste warning. Son objet triage montre la règle :
Cet extrait ne montre que les champs modifiés. Dans la requête, 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 :
Une réponse 200 OK contient le problème complet en version 1. Les valeurs capturées de severity et de status ne changent pas :
Cet extrait ne montre que certains champs. Une règle ne résout pas, n’archive pas et ne rouvre pas un problème. Utilisez pour cela le changement de statut. Une priorité dérivée suit la nouvelle gravité effective. Lisez le problème avec response_version=2 ou 3 pour la voir. Une gravité non prise en charge renvoie 422 :
Un champ de corps inconnu, comme 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 de error et de next dépend de l’erreur :
Utilisez 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 :
Ajoutez --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.