A la découverte de Steampipe avec les plugins Scalingo et Airtable

J’ai récemment découvert Steampipe qui permet d’interroger des tas d’API distantes en direct avec du SQL. Au delà d’avoir un langage commun pour utiliser une API quelconque, il est possible de mixer plusieurs sources de données avec des jointures, de faire des vérifications et bien plus encore.

Pour rajouter des sources de données disponible, il est nécessaire de créer/installer des plugins.

Je me suis lancé dans la création de deux plugins, le premier pour Scalingo et le deuxième pour Airtable.

Scalingo

Le plugin Scalingo permet d’interroger un grand nombre de ressources de l’API de Scalingo, commes les applications, les addons, les collaborateurs, etc …

Par exemple cette requête va afficher l’ensemble des applications hébergées:

select
  name,
  region,
  url
from
  scalingo_app

Quelques cas d’usages:

  • Nous avons désormais pour Pix des règles pour vérifier la consistance de la configuration de nos applications avec pix-steampipe-mod-scalingo-compliance.

  • Rechercher quelle application utilise une certaine variable d’environnement.

      select
        a.name as app_name,
        e.name as env_name
      from
        scalingo_app as a
      join
        scalingo_environment as e
      on
        a.name = e.app_name
      where
        e.value = 'my variable value'
    
  • Lors d’un départ d’une personne, il est facile de lister l’ensemble des applications auxquelles elle avait accès (et les supprimer ensuite, a la main).

      select
        a.name as app_name,
        c.email as email
      from
        scalingo_collaborator as c
      inner join
        scalingo_app as a
      on
        a.name = c.app_name
      where
        email = 'xxx'
    

Airtable

Le plugin Airtable permet d’interroger vos tables Airtable en utilisant du SQL. En plus de permettre d’utiliser les formula d’Airtable, il permet surtout de faire des jointures, fort pratique dans le cas d’Airtable.

Quelques cas d’usages:

  • extraire une liste de fichiers HTML référencé dans des épreuves Pix faisant partie d’un domaine précis.

      select
        c.fields->>'Référence' as ref,
        a.fields->>'Nom' as nom,
        e.id,
        e.fields->>'Consigne' as consigne,
        e.fields->>'Statut' as statut,
        e.fields->>'Embed URL' as embed
      from
        epreuves e,
        jsonb_array_elements_text(e.fields->'Acquis') acquis,
        acquis a,
        jsonb_array_elements_text(a.fields->'Compétences') competence,
        competences c
      where
        acquis = a.id
        and competence = c.id
        and c.fields->Code = '3'
        and (e.fields->>'Consigne' LIKE '%.html%'
             or e.fields->>'Embed URL' is not null)
      order by
        c.fields->'Référence'
    
  • trouver un id en doublon suite a une erreur.

      select
        fields->'id',
        count(*) as count
      from
        xxx
      group by
        fields->'id' having count(*) > 1
    
  • calculer une somme d’une colonne en sélectionnant spécifiquement une sous partie avec une jointure.

      select
        sum((a.fields->'PixValue')::float)
      FROM
        acquis a,
        jsonb_array_elements_text(a.fields->'Compétence (via Tube)') as cid,
        competences c
      where
        c.fields->>'Sous-domaine' = '2.1'
        and cid = c.id
        and a.fields->>'Status' = 'actif'
    

Une évolution du plugin est d’utiliser l’API metadata lorsque celle-ci sera disponible. Il sera ainsi possible d’offrir une réelle introspection des tables avec des colonnes du bon type.

Conclusion

En bref, Steampipe est vraiment sympa à utiliser. Très rapidement on peut créer ses premières requêtes et réaliser des opérations qui seraient difficiles de réaliser autrement.

Un commentaire ? Contactez moi par email.