Service Catalog

04/06/2024 - 11:16:17

12'16"

Un catalogue de services est une liste organisée et travaillée, constamment mise à jour de services business et de technologies disponibles au sein d'une organisation. Il s'agit d'un outil de gestion des connaissances le plus souvent accessible sous la forme d'un portail qui peut être interrogé pour prendre connaissance des services existants répertoriés, le cas échéant de les essayer.

C'est une définition large qui s'applique également à ce qui est appelé Catalogue Applicatif, un recencement de toutes les applications existantes dans l'entreprise et qui, le plus souvent, se trouve être répertoriées dans une CMDB. Ce sont les mêmes principes de base qui s'appliquent, à la granularité près : un catalogue applicatif reprend d'autres informations que celles d'un catalogue de services.

Mise en garde

Il existe de très nombreux outils qui permettent de gérer le catalogue de services. Cet article n'a ni pour vocation de faire l'éloge de tel outil par rapport à tel outil ni de construire un tel outil. Par contre, je vais vous montrer quelle est la structure minimale de ce genre d'outils et en construire un qui offre le service minimal, une espèce de micro-outil que nous allons construire progressivement dans le présent article de telle sorte qu'il alimente votre propre réflexion.

Structure

Voici, rapidement dessinée, la table des informations qu'il faut capturer dans le catalogue de services :

Champ Description
Id id unique du service (e.g. bee661d9-ea42-4886-b83d-4b1fa286a4ad)
Lupdate Date et heure de dernière mise à jour des infos du service dans le catalogue
Name Nom du service (e.g. stockBEL)
Description Description du service: une explication claire et concise de ce que le service accomplit (le what, mais pas le how) (e.g. cotation des valeurs représentées dans le BEL20 - Nom, dernière position, précédente position, delta journalier, progression ou régression journalière en %, % sur la semaine, sur le mois et sur l'année. Données mises à jour toutes les 20 minutes)
Category La classification du service pour faciliter la navigation et la recherche dans le catalogue. Chez TRQL Radio nous avons pris le pli de catégoriser nos services par entité comme référencé par wikidata (e.g. le BEL20 est un Stock Market ce qui correspond à l'entité Q475000 — https://www.wikidata.org/wiki/Q475000)
Endpoint Le endpoint d'accès au service (e.g. https://www.trql.fm/vaesoli!/?stockBEL)
Owner Le nom du propriétaire du service. Chez TRQL Radio, nous avons décidé d'utiliser l'adresse email de la personne (e.g. pb@latosensu.be)
SLA Les accords de niveau de service (SLA) qui définissent les attentes et les engagements de service (e.g. "best effort")
Audience Les groupes d'utilisateurs qui peuvent demander ou accéder au service (e.g. "all")
Pricing Les coûts associés à l'utilisation du service, si applicable (e.g. "free")
Links Liste de liens additionnels relatés au service décrit

En outre, il n'est pas rare de retouver ces autres informations :

  • Approvals : toute approbation nécessaire avant de fournir le service
  • Conditions de livraison : Comment et quand le service sera fourni.
  • Composants principaux : Les éléments essentiels qui constituent le service.
  • Directives et responsabilités : Les règles régissant l'utilisation du service et les responsabilités des parties impliquées

Restant ici cantonnés aux principes de base, nous nous contenterons des informations reprises dans le tableau pour construire notre petit catalogue que je choisis délibérémment de stocker sous la forme d'un XML.

Pour le service en question, voici ce que donne ledit XML:

<Catalog>
    <Service id="bee661d9-ea42-4886-b83d-4b1fa286a4ad" lupdate="20240527 10:19:04">
        <Name>
            <![CDATA[ stockBEL ]]>
        </Name>
        <Description>
            <![CDATA[ Cotation des valeurs du BEL20 - Nom, dernière position, précédente
                      position, delta journalier, progression ou régression journalière
                      en %, % sur la semaine, sur le mois et sur l'année. Données mises
                      à jour toutes les 20 minutes ]]>
        </Description>
        <Category>
            <![CDATA[ Q475000 ]]>
        </Category>
        <Endpoint>
            <![CDATA[ https://www.trql.fm/vaesoli!/?stockBEL ]]>
        </Endpoint>
        <Owner>
            <![CDATA[ pb@latosensu.be ]]>
        </Owner>
        <SLA>
            <![CDATA[ Best effort ]]>
        </SLA>
        <Audience>
            <![CDATA[ All ]]>
        </Audience>
        <Pricing>
            <![CDATA[ Free ]]>
        </Pricing>
        <Links>
            <![CDATA[ ]]>
        </Links>
    </Service>
</Catalog>

Queryable

Votre catalogue DOIT être interrogeable, non seulement par les hommes mais aussi par les … machines !

Le catalogue vient donc, invariablement, avec une interface et avec un jeu de … services ou bien avec un accès direct au stockage physique (ce qui n'est vraiment pas la meilleure option), ne fût-ce qu'en mode lecture seule (read-only).

Dans notre cas simplistique, je vais choisir l'accès direct au fichier c'est-à-dire au fichier XML.

Pour la facilité de l'exemple, je mettrai 3 services dans le catalogue, on en fera l'extraction, on présentera les 3 services sur la présente page et chaque service sera appellable directement. Quand nous aurons fait cela, on pourra se dire que nous avons réalisé le catalogue de services le plus simple qui soit. À partir de là, vous pourrez en concevoir de plus complets ou … utiliser ceux disponibles sur le marché (ce qui est grandement conseillé).

Le catalogue en XML (3 services)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Catalog>
    <Service id="bee661d9-ea42-4886-b83d-4b1fa286a4ad" lupdate="20240527 10:19:04">
        <Name><![CDATA[stockBEL]]></Name>
        <Description><![CDATA[Cotation des valeurs du BEL20 -
        Nom, dernière position, précédente position, delta journalier,
        progression ou régression journalière en %, % sur la semaine, sur le
        mois et sur l'année. Données mises à jour toutes les 20
        minutes]]></Description>
        <Category><![CDATA[Q475000]]></Category>
        <Endpoint><![CDATA[https://www.trql.fm/vaesoli!/?stockBEL]]></Endpoint>
        <Owner><![CDATA[pb@latosensu.be]]></Owner>
        <SLA><![CDATA[Best effort]]></SLA>
        <Audience><![CDATA[All]]></Audience>
        <Pricing><![CDATA[Free]]></Pricing>
        <Links><![CDATA[]]></Links>
    </Service>

    <Service id="b99692f8-0e87-4e37-87bd-abefc719b2e5" lupdate="20240527 10:36:17">
        <Name><![CDATA[gdp-ppp]]></Name>
        <Description><![CDATA[PIB par pays; PIB par habitant pondéré par le pouvoir
        d'achat (Pondered by Purchase Power)]]></Description>
        <Category><![CDATA[Q12638]]></Category>
        <Endpoint><![CDATA[https://www.trql.fm/vaesoli!/?gdp-ppp]]></Endpoint>
        <Owner><![CDATA[pb@latosensu.be]]></Owner>
        <SLA><![CDATA[Best effort]]></SLA>
        <Audience><![CDATA[All]]></Audience>
        <Pricing><![CDATA[Free]]></Pricing>
        <Links><![CDATA[]]></Links>

    </Service>

    <Service id="f1081b6a-815d-40fa-a9d9-893dfc2c8d78" lupdate="20240527 10:44:42">
        <Name><![CDATA[corporate-tax]]></Name>
        <Description><![CDATA[Pourcentage de taxes des entreprise par pays. name,
            dernière valeur, valeur précédente, période de dernière mise à jour,
            unité applicable aux valeurs]]></Description>
        <Category><![CDATA[Q8161]]></Category>
        <Endpoint><![CDATA[https://www.trql.fm/vaesoli!/?corporate-tax]]></Endpoint>
        <Owner><![CDATA[pb@latosensu.be]]></Owner>
        <SLA><![CDATA[Best effort]]></SLA>
        <Audience><![CDATA[All]]></Audience>
        <Pricing><![CDATA[Free]]></Pricing>
        <Links><![CDATA[]]></Links>
    </Service>

</Catalog>

Le catalogue sous forme d'UI (ultra-simplistique)

Afin de limiter le code, je n'afficherai pas tous les champs du catalogue. Voici ce que cela donne :

Services
ServiceDescription
BankruptciesNombre de faillites par pays. Nom du pays, dernière mesure, mesure précédente, unité (companies or/and individuals)
Category: Q152074 - https://www.wikidata.org/wiki/Q152074
Endpoint: https://www.trql.fm/vaesoli!/?bankruptcies
Contact: pb@latosensu.be
Co2-emissions
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?co2-emissions
Contact: pb@latosensu.be
Commodities
Category: Q8134 - https://www.wikidata.org/wiki/Q8134
Endpoint: https://www.trql.fm/vaesoli!/?commodities
Contact: pb@latosensu.be
corporate-taxPourcentage de taxes des entreprise par pays. name, dernière valeur, valeur précédente, période de dernière mise à jour, unité applicable aux valeurs
Category: Q8161 - https://www.wikidata.org/wiki/Q8161
Endpoint: https://www.trql.fm/vaesoli!/?corporate-tax
Contact: pb@latosensu.be
Corruption
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?corruption
Contact: pb@latosensu.be
Cryptos
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?cryptos
Contact: pb@latosensu.be
Currencies
Category: Q8142 - https://www.wikidata.org/wiki/Q8142
Endpoint: https://www.trql.fm/vaesoli!/?currencies
Contact: pb@latosensu.be
Debt
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?debt
Contact: pb@latosensu.be
ExpenditureVSrevenues
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?expenditureVSrevenues
Contact: pb@latosensu.be
Fiscal-expenditure
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?fiscal-expenditure
Contact: pb@latosensu.be
Food-inflation
Category: -
Endpoint: https://www.trql.fm/vaesoli!/?food-inflation
Contact: pb@latosensu.be
gdp-pppPIB par pays; PIB par habitant pondéré par le pouvoir d'achat (Pondered by Purchase Power)
Category: Q12638 - https://www.wikidata.org/wiki/Q12638
Endpoint: https://www.trql.fm/vaesoli!/?gdp-ppp
Contact: pb@latosensu.be
stockBELCotation des valeurs du BEL20 - Nom, dernière position, précédente position, delta journalier, progression ou régression journalière en %, % sur la semaine, sur le mois et sur l'année. Données mises à jour toutes les 20 minutes
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockBEL
Contact: pb@latosensu.be
stockATXCotation des valeurs de l'index autrichien. Nom, dernière position, précédente position, delta journalier, progression ou régression journalière en %, % sur la semaine, sur le mois et sur l'année. Données mises à jour toutes les 20 minutes
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockATX
Contact: pb@latosensu.be
StockBIST100Q475000
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockBIST100
Contact: pb@latosensu.be
StockCAC
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockCAC
Contact: pb@latosensu.be
StockCH20
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockCH20
Contact: pb@latosensu.be
StockDAX
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockDAX
Contact: pb@latosensu.be
StockES35
Category: Q475000 - https://www.wikidata.org/wiki/Q475000
Endpoint: https://www.trql.fm/vaesoli!/?stockES35
Contact: pb@latosensu.be

Le code de l'UI (en PHP)

<?php
    $oDom = new \DOMDocument();

    if ( $oDom->load( $file = v::FIL_AddBS( __DIR__ ) . 'service-catalog.xml' ) )
    {
        if ( $oXPath = new \DOMXPath( $oDom ) )
        {
            if ( ( $services = $oXPath->query( '//Service' ) ) && $services->length> 0 )
            {
                echo "<table class=\"services\">\n";
                    echo "<caption>Services</caption>\n";

                    echo "<thead>\n";
                        echo "<tr>\n";
                            echo "<th>Service</th>";
                            echo "<th>Description</th>";
                        echo "<tr>\n";
                    echo "</thead>\n";

                    echo "<tbody>\n";
                        foreach( $services as $service )
                        {
                            $id         = $service->getAttribute( 'id' );
                            $name       = trim( $oXPath->query( "Name"       ,$service )->item(0)->nodeValue );
                            $desc       = trim( $oXPath->query( "Description",$service )->item(0)->nodeValue );
                            $category   = trim( $oXPath->query( "Category"   ,$service )->item(0)->nodeValue );
                            $endpoint   = trim( $oXPath->query( "Endpoint"   ,$service )->item(0)->nodeValue );
                            $owner      = trim( $oXPath->query( "Owner"      ,$service )->item(0)->nodeValue );

                            $catLink    = null;

                            if ( ! empty( $category ) )
                                $catLink = "https://www.wikidata.org/wiki/{$category}";

                            echo "<tr id=\"{$id}\">\n";
                                echo "<td class=\"name\"><code>{$name}</code></td>";
                                echo "<td class=\"desc\">{$desc}</td>";
                            echo "</tr>\n";

                            echo "<tr id=\"{$id}_details\">\n";
                                echo "<td class=\"details\" colspan=\"2\">";
                                    echo "<b>Category</b>: {$category} - <a href=\"{$catLink}\" target=\"_blank\">{$catLink}</a><br />";
                                    echo "<b>Endpoint</b>: <a href=\"{$endpoint}\" target=\"_blank\">{$endpoint}</a><br />";
                                    echo "<b>Contact</b>: <a href=\"mailto:{$owner}\" target=\"_blank\">{$owner}</a>";
                                echo "</td>\n";
                            echo "</tr>\n";
                        }   /* foreach( $services as $service ) */
                    echo "</tbody>\n";
                echo "</table>\n";
            }   /* if ( ( $services ... */
        }   /* if ( $oXPath = new ... */
    }   /* if ( $oDom->;load( $file = ... */
Telegram icon