auditing-endpoints

Par posthog · skills

Audite chaque endpoint d'un projet PostHog pour détecter les endpoints obsolètes, les matérialisations en échec et les versions matérialisées inutilisées. À utiliser quand l'utilisateur demande « quels endpoints puis-je nettoyer ? », « certains de mes endpoints sont-ils cassés ? », « quelles versions matérialisées sont encore appelées ? », ou souhaite effectuer une passe de nettoyage complète sur le produit Endpoints. Produit un rapport priorisé regroupé par type de problème, avec des actions recommandées, mais ne modifie rien sans confirmation explicite.

npx skills add https://github.com/posthog/skills --skill auditing-endpoints

Audit des endpoints

Cette skill produit un audit à l'échelle du projet du produit Endpoints. Utilisez-la quand l'utilisateur veut identifier ce qui nettoyer — endpoints inutilisés, matérialisations défaillantes, versions matérialisées que personne n'appelle plus. Elle ne modifie rien ; elle rapporte.

L'investigation plus approfondie par endpoint est diagnosing-endpoint-performance. Le rôle de l'audit est de trouver des candidats et de les transmettre.

Quand utiliser cette skill

  • « Audit mes endpoints » / « Quels endpoints puis-je nettoyer ? »
  • L'utilisateur reprend un projet et veut savoir ce qu'il a hérité
  • Un examen périodique (mensuel / trimestriel) de la prolifération d'endpoints
  • L'utilisateur a dépassé son budget de coûts de matérialisation et veut savoir quoi désactiver

Les outils dédiés offrent une vue rapide au niveau de l'endpoint. Pour la fréquence d'appel, la récence et le coût dans le temps, interrogez la table query_log avec execute-sql (niveau endpoint). La récence par version provient de endpoint-versions — chaque version porte son propre last_executed_at.

Outils disponibles

Outil À quoi ça sert
execute-sql (HogQL) Chemin de lecture principal. Interrogez system.data_modeling_endpoints pour les métadonnées (name, is_active, current_version, derived_from_insight, last_executed_at) et query_log pour l'utilisation au niveau endpoint (compteurs d'appels, récence, durée, octets)
endpoint-materialization-status Par endpoint : éligibilité de matérialisation, statut actuel, dernière exécution, dernière erreur (pas dans les tables système — utilisez cet outil)
endpoint-versions Toutes les versions d'un endpoint, les plus récentes d'abord, avec la requête de chaque version, l'état de matérialisation, et last_executed_at
endpoint-update Chemin d'écriture — désactiver (is_active: false) ou dématérialiser (is_materialized: false) après confirmation de l'utilisateur
agent-feedback Indiquez à l'équipe PostHog ce qui manque ou ce qui est déroutant dans ce flux pour que le produit et la skill s'améliorent

Préférez la lecture depuis les tables système plutôt que les outils endpoints-get-all / endpoint-get — une seule requête SQL retourne l'inventaire complet et vous permet de joindre les métadonnées à l'utilisation dans query_log.

Qu'est-ce qui compte comme un problème

Catégorie Déclencheur Action typique
Jamais appelé Aucune ligne dans query_log pour l'endpoint (appels clé API personnelle uniquement) Confirmer avec l'utilisateur, puis désactiver
Obsolète query_log montre que le dernier appel remonte à plus de 30 jours Confirmer avec l'utilisateur ; souvent sûr de désactiver
Inactif is_active = 0 dans system.data_modeling_endpoints Vérifier l'intention ; si abandonné, supprimer
Matérialisation défaillante endpoint-materialization-status retourne Failed avec une erreur Transmettre à diagnosing-endpoint-performance
Version matérialisée inutilisée Une version matérialisée dont last_executed_at (depuis endpoint-versions) est null ou ancien Dématérialiser cette version, ou passer à une plus récente
Versions dérives De nombreuses versions existent (requête a changé à plusieurs reprises) Bruit historique — pas un problème, mais à noter

Les comptages d'utilisation concernent uniquement les appels en clé API personnelle — un endpoint exercé uniquement depuis l'onglet Playground ou l'app ressemblera à inutilisé. Le last_executed_at par version n'est enregistré que pour les exécutions depuis l'ajout de ce suivi, donc une version peut afficher null tout en étant utilisée ; confirmez toujours avant de supprimer.

Workflow

1. Lister les endpoints et leurs métadonnées

Une seule requête execute-sql récupère l'inventaire complet depuis system.data_modeling_endpoints :

SELECT name, is_active, current_version, derived_from_insight, last_executed_at
FROM system.data_modeling_endpoints
ORDER BY name

Aucune ligne → le projet n'a pas d'endpoints ; dites-le et arrêtez. N'inventez pas de problèmes. (La colonne last_executed_at ici est un timestamp de commodité au niveau endpoint ; pour la fréquence d'appel et le coût, utilisez query_log à l'étape suivante.)

2. Extraire l'utilisation depuis query_log

query_log enregistre chaque appel en clé API personnelle, identifié avec le nom de l'endpoint. Une requête donne la récence et les compteurs d'appels sur tous les endpoints :

SELECT name, count() AS calls, max(query_start_time) AS last_called
FROM query_log
WHERE endpoint LIKE '%/endpoints/%' AND is_personal_api_key_request
GROUP BY name
ORDER BY name

Croisez avec l'étape 1 :

  • Dans les métadonnées, absent de query_log → jamais appelé via clé API
  • Dernier appel plus de 30 jours ago → obsolète

query_log expose aussi query_duration_ms, read_rows, et read_bytes par appel — utile pour signaler les endpoints coûteux dans le même passage. C'est au niveau endpoint ; la récence par version provient de endpoint-versions (étape 3).

3. Vérifier la santé de la matérialisation et les versions inutilisées

Pour chaque endpoint matérialisé, appelez endpoint-materialization-status (ce n'est pas dans les tables système). Mettez en avant ceux avec status: "Failed" séparément — ce sont des défaillances actives, pas de l'obsolescence.

Appelez ensuite endpoint-versions et lisez le last_executed_at de chaque version : une version matérialisée qui est null ou ancien est un candidat de version-matérialisée-inutilisée. Traitez ceci comme une piste, pas une preuve — la récence par version compte uniquement les exécutions en clé API depuis l'ajout du suivi, donc confirmez avec l'utilisateur avant de dématérialiser.

4. Présenter l'audit

Proposez un rapport priorisé groupé par catégorie. Ne videz pas du JSON brut ; utilisez un tableau lisible par section :

## Audit des endpoints — 9 problèmes

### 🔴 Matérialisations défaillantes (1)
- weekly_revenue (v3) — Défaillance il y a 2h, « Column 'event_date' does not exist »
  → transmettre à diagnosing-endpoint-performance

### 🟠 Jamais appelé via clé API (3)
- internal_admin_query — créé il y a 5 mois
- legacy_signup_funnel — créé il y a 1 an, matérialisé
- experiment_arm_lookup — créé il y a 9 mois

### 🟠 Versions matérialisées inutilisées (2)  [depuis endpoint-versions]
- monthly_active_users — v3 matérialisée, last_executed_at null (actuellement sur v4 — dématérialiser v3)
- order_summary — v1 matérialisée, last_executed_at null

### 🟡 Obsolètes (3)
- holiday_promo_2024 — dernier appel il y a 4 mois
- ab_test_phase_1 — dernier appel il y a 2 mois
- daily_revenue_cohort — dernier appel il y a 45 jours

Ordre recommandé :
1. Investiguer la matérialisation défaillante (bloque les données fraîches)
2. Dématérialiser les versions inutilisées (libère stockage + compute)
3. Désactiver les endpoints jamais appelés (si l'utilisateur confirme)
4. Examiner les endpoints obsolètes avec l'utilisateur

Le format exact importe moins que : priorisé, groupé, actionnable, et transmission claire.

5. Proposer l'étape suivante

Terminez par une question claire, pas une décision :

  • « Veux-tu que je dématérialise les versions inutilisées ? » — nécessite endpoint-update avec is_materialized: false par version
  • « Veux-tu que je désactive les endpoints jamais appelés ? » — nécessite endpoint-update avec is_active: false
  • « Veux-tu que je creuse la matérialisation défaillante ? » — transmet à diagnosing-endpoint-performance

N'agissez jamais à partir de l'audit seul. Désactiver ou dématérialiser affecte les consommateurs API externes ; confirmez toujours avant de modifier.

Exemple d'interaction

Utilisateur : « Audit mes endpoints »

Étapes de l'agent :
- execute-sql sur system.data_modeling_endpoints → 12 endpoints (4 matérialisés)
- execute-sql sur query_log groupés par name → 8 endpoints ont des appels
- endpoint-materialization-status sur chaque endpoint matérialisé → 1 défaillant
- endpoint-versions sur les matérialisés → order_summary v2's last_executed_at est null

- Rapport :
  « Trouvé 6 choses à regarder parmi 12 endpoints :

   🔴 Matérialisations défaillantes (1)
   - monthly_active_users (v2) — matérialisation défaillante hier avec
     'memory limit exceeded'. L'endpoint reste appelable en ligne mais
     les réponses seront plus lentes.

   🟠 Jamais appelé via clé API (3)
   - legacy_funnel_v1 — créé il y a 11 mois
   - test_export — créé il y a 3 mois
   - admin_dump — créé il y a 8 mois, matérialisé (gaspillage)

   🟠 Versions matérialisées inutilisées (1)  [depuis endpoint-versions]
   - order_summary v2 — matérialisée mais son last_executed_at est null
     tandis que v3 est courant. Probablement sûr de dématérialiser v2.

   🟡 Obsolètes (1)
   - holiday_2024 — dernier appel il y a 5 mois

   Avertissement : l'utilisation compte uniquement les appels en clé API personnelle ;
   les exécutions depuis le playground et le dashboard ne sont pas comptées. La récence
   par version vient de endpoint-versions et est clairsemée. Confirmez avant de désactiver.

   Veux-tu que je commence par la matérialisation défaillante, ou nettoie la
   version inutilisée d'abord ? »

Notes importantes

  • L'audit est en lecture seule. N'appelez jamais d'outils destructeurs depuis ce flux. Transmettez ou confirmez avant toute modification.
  • Vide = sain. Ne remplissez pas un rapport vide avec des problèmes théoriques. « Rien à nettoyer » est une bonne réponse.
  • Lisez avec SQL, creusez avec l'outil de version. system.data_modeling_endpoints (métadonnées) et query_log (compteurs d'appels au niveau endpoint, récence, coût) via execute-sql répondent à la plupart de l'audit. La récence par version provient de endpoint-versions (le last_executed_at de chaque version).
  • Portée clé API uniquement. L'utilisation compte uniquement les appels en clé API personnelle. Un endpoint exercé uniquement depuis l'onglet Playground ou l'app ressemblera à inutilisé. Confirmez toujours avant d'agir.
  • La matérialisation coûte stockage et compute. Quand un endpoint n'a plus besoin de matérialisation, la solution la moins chère est endpoint-update avec is_materialized: false — pas supprimer l'endpoint.
  • Inactif ≠ obsolète. Un endpoint avec is_active: false a été délibérément éteint. Ne recommandez pas la suppression à moins que l'utilisateur confirme qu'il est vraiment abandonné.

Skills similaires