A la découverte de Steampipe avec les plugins Scalingo et Airtable
- François
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.