Gestion des Handlers

Classes Handler pour les différents type de connexion (SQLite,SQLAlchemy, Warp10, Artimon, etc.).

Created on Sat Apr 11 06:41:28 2020

@author: Cyrile Delestre

class dstk.metrics._handlers.ArtimonAPIHandler(producer: str, host: str = '127.0.0.1', port: str = '9023', hostname: Optional[str] = None, environment: Optional[str] = None, labels: Optional[Dict[str, Union[float, int, str]]] = None, format: List[str] = ['name', 'msg'])[source]

Bases: dstk.metrics._handlers.BaseArtimon

Classe permettant de créer un handler designné pour Artimon le parser Warp10 du SI Arkéa. Elle utilise le protocal POST pour envoyer la donnée dans Warp10.

Parameters:
producerstr

nom du producer Artimon/Warp10.

hoststr

host de l’API Artimon (par défaut ‘127.0.0.1’).

portstr

port de l’API Artimon (par défaut ‘9023’).

hostnameOptional[str]

nom facultatif du hostname (si non renseigné sera complété automatiquement par Artimon).

environmentOptional[str]

nom facultatif de l’environnement (si non renseigné sera complété automatiquement par Artimon).

labelsOptional[Dict[str, Union[float, int, str]]]

label en complément de la métrique (comme l’environnement, la version, etc.). Dans Artimon les labels sont références aux tags.

formatList[str]

liste des attributs du LogRecord qu’on souhaite récupérer et stocker. Liste des attributs de LogRecord présentés à l’URL :

asctimestr

Timestamps de création du log interprétable humainement ;

createdfloat

Timestamps de création du log ;

filenamestr

Nom du fichier dans lequel a été appelé le logging ;

funcNamestr

Nom de la fonction contenant l’appel du logging ;

levelnamestr

Nom de level d’alerte (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) ;

levelnoint

Numérique associé au level d’alerte ;

messagestr

Message envoyé par le logging (à définir par l’utilisateur) ;

modulestr

Nom du module ;

msecsint

Temps de création de LogRicord (en milliseconde) ;

namestr

Nom du logger (permet d’identifier les différents logger) ;

pathnamestr

Chemin complet du fichier dans lequel a été appelé le logging (si disponible);

processint

Process ID (si disponible) ;

processNamestr

Nom du process ID (si disponible) ;

relativeCreatedfloat

Temps en millisecondes de création de LogRecord, par rapport au temps de chargement du module de logging ;

threadint

Thread ID (si disponible) ;

threadNamestr

Nom du thread ID (si disponible).

La suite est composée des attributs de LogRecord créés
enginestr

Nom du moteur (‘sqlite’, ‘sqlalchemy’, ‘Warp10’, etc.).

See also

ArtimonLocalHandler

Notes

Avec cette classe il n’est pas possible d’utiliser le format “message”, il est important de ce référer à “msg” pour le message. De même il n’est pas nécessaire de mettre “msg” dans l’argument format car le contenu du message sera utilisé automatiquement comme argument de la série.

Examples

Envoi d’un timer mesurant de temps d’exécution d’une fonction et de sans sortie.

>>> import logging
>>> from time import sleep
>>> import numpy as np
>>> from dstk.metrics import ArtimonAPIHandler, timer, sniffer
>>> 
>>> # Création du logger
>>> logging.basicConfig(
>>>     level = logging.INFO,
>>>     handlers = [
>>>         ArtimonAPIHandler(
>>>             producer = 'NAME.producer',
>>>             format = ['asctime', 'threadName']
>>>         )
>>>     ]
>>> )
>>> logger_timer = logging.getLogger('metrics.python.timer')
>>> logger_sniffer = logging.getLogger('metrics.python.sniffer')
>>> @timer(logger=logger_timer, delta_time=True)
>>> @sniffer(logger=logger_sniffer)
>>> def function_test(a=1, b=1, sleep_time=0.5):
>>>     r"Docstring de la fonction fonction_test"
>>>     sleep(sleep_time)
>>>     return a+b
>>> res = [
>>>     function_test(a=ii, sleep_time=5*np.random.rand())
>>>     for ii in range(10)
>>> ]
>>> res
[1, 3, 4, 5, 6, 7, 8, 9, 10]

Les données seront envoyés directement vers Warp10.

emit(record: logging.LogRecord)None[source]

Méthode d’envoi des logs à implémenter.

class dstk.metrics._handlers.ArtimonLocalHandler(producer: str, path: str = '/var/run/artimonV2', hostname: Optional[str] = None, environment: Optional[str] = None, labels: Optional[Dict[str, Union[float, int, str]]] = None, format: List[str] = ['name', 'msg'])[source]

Bases: dstk.metrics._handlers.BaseArtimon

Classe permettant de créer un handler designné pour Artimon le parser Warp10 du SI Arkéa. Elle utilise le collecteur Artimon qui doit être installé en local. Le collecteur Artimon va cherche les fichiers finissant par l’extention .artimon dans le répertoire par défaut ‘/var/run/artimonV2’.

Parameters:
producerstr

nom du producer Artimon/Warp10.

pathstr

répertoire du dépot des métriques pour le collecteur Artimon (par défaut ‘/var/run/artimonV2).

hostnameOptional[str]

nom facultatif du hostname (si non renseigné sera complété automatiquement par Artimon).

environmentOptional[str]

nom facultatif de l’environnement (si non renseigné sera complété automatiquement par Artimon).

labelsOptional[Dict[str, Union[float, int, str]]]

label en complément de la métrique (comme l’environnement, la version, etc.). Dans Artimon les labels sont références aux tags.

time_lifeint (deprecated)

nombre de jour d’activité du fichier récoltant les métriques. Le collecteur Artimon supprime automatiquement les fichiers qui ont 7 jours d’inactivité (par défaut 1 jours).

formatList[str]

liste des attributs du LogRecord qu’on souhaite récupérer et stocker. Liste des attributs de LogRecord présentés à l’URL :

asctimestr

Timestamps de création du log interprétable humainement ;

createdfloat

Timestamps de création du log ;

filenamestr

Nom du fichier dans lequel a été appelé le logging ;

funcNamestr

Nom de la fonction contenant l’appel du logging ;

levelnamestr

Nom de level d’alerte (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) ;

levelnoint

Numérique associé au level d’alerte ;

messagestr

Message envoyé par le logging (à définir par l’utilisateur) ;

modulestr

Nom du module ;

msecsint

Temps de création de LogRicord (en milliseconde) ;

namestr

Nom du logger (permet d’identifier les différents logger) ;

pathnamestr

Chemin complet du fichier dans lequel a été appelé le logging (si disponible);

processint

Process ID (si disponible) ;

processNamestr

Nom du process ID (si disponible) ;

relativeCreatedfloat

Temps en millisecondes de création de LogRecord, par rapport au temps de chargement du module de logging ;

threadint

Thread ID (si disponible) ;

threadNamestr

Nom du thread ID (si disponible).

La suite est composée des attributs de LogRecord créés
enginestr

Nom du moteur (‘sqlite’, ‘sqlalchemy’, ‘Warp10’, etc.).

See also

ArtimonAPIHandler

Notes

Avec cette classe il n’est pas possible d’utiliser le format “message”, il est important de ce référer à “msg” pour le message. De même il n’est pas nécessaire de mettre “msg” dans l’argument format car le contenu du message sera utilisé automatiquement comme argument de la série.

L’argument time_life n’est plus pris en compte et sera supprimé dans les versions futures.

Examples

Envoi d’un timer mesurant de temps d’exécution d’une fonction et de sans sortie.

>>> import logging
>>> from time import sleep
>>> import numpy as np
>>> from dstk.metrics import ArtimonLocalHandler, timer, sniffer
>>> 
>>> # Création du logger
>>> logging.basicConfig(
>>>     level = logging.INFO,
>>>     handlers = [
>>>         ArtimonLocalHandler(
>>>             producer = 'NAME.producer',
>>>             format = ['asctime', 'threadName']
>>>         )
>>>     ]
>>> )
>>> logger_timer = logging.getLogger('metrics.python.timer')
>>> logger_sniffer = logging.getLogger('metrics.python.sniffer')
>>> @timer(logger=logger_timer, delta_time=True)
>>> @sniffer(logger=logger_sniffer)
>>> def function_test(a=1, b=1, sleep_time=0.5):
>>>     r"Docstring de la fonction fonction_test"
>>>     sleep(sleep_time)
>>>     return a+b
>>> res = [
>>>     function_test(a=ii, sleep_time=5*np.random.rand())
>>>     for ii in range(10)
>>> ]
>>> res
[1, 3, 4, 5, 6, 7, 8, 9, 10]

Les données seront envoyés directement vers le fichier date_du_jour.artimon dans le répertoire ‘/var/run/artimonV2’. C’est le collecteur Artimon qui ce chargera de l’envoie vers Warp10.

emit(record: logging.LogRecord)None[source]

Méthode d’envoi des logs à implémenter.

class dstk.metrics._handlers.BaseArtimon(producer: str, hostname: Optional[str] = None, environment: Optional[str] = None, labels: Optional[Dict[str, Union[float, int, str]]] = None, format: List[str] = ['name', 'msg'])[source]

Bases: dstk.metrics._handlers.HandlerBase

Classe de base permettant de gérer les données à envoyer dans Warp10 via Artimon. Cette classe n’est pas à utiliser directement, elle est utiliser en tant que classe mère aux classes ArtimonAPIHandler et ArtimonLocalHandler.

Parameters:
producerstr

Nom du producer vers lequel les métriques seront envoyées. Il doit avoir la forme <code_boite>.<nom_appli>

hostnameOptional[str]

nom facultatif du hostname (si non renseigné sera complété automatiquement par Artimon).

environmentOptional[str]

nom facultatif de l’environnement (si non renseigné sera complété automatiquement par Artimon).

labelsOptional[Dict[str, Union[float, int, str]]]

label en complément de la métrique (comme l’environnement, la version, etc.). Dans Artimon les labels sont références aux tags.

formatList[str]

liste des attributs du LogRecord qu’on souhaite récupérer et stocker. Liste des attributs de LogRecord présentés à l’URL :

asctimestr

Timestamps de création du log interprétable humainement ;

createdfloat

Timestamps de création du log ;

filenamestr

Nom du fichier dans lequel a été appelé le logging ;

funcNamestr

Nom de la fonction contenant l’appel du logging ;

levelnamestr

Nom de level d’alerte (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) ;

levelnoint

Numérique associé au level d’alerte ;

messagestr

Message envoyé par le logging (à définir par l’utilisateur) ;

modulestr

Nom du module ;

msecsint

Temps de création de LogRicord (en milliseconde) ;

namestr

Nom du logger (permet d’identifier les différents logger) ;

pathnamestr

Chemin complet du fichier dans lequel a été appelé le logging (si disponible);

processint

Process ID (si disponible) ;

processNamestr

Nom du process ID (si disponible) ;

relativeCreatedfloat

Temps en millisecondes de création de LogRecord, par rapport au temps de chargement du module de logging ;

threadint

Thread ID (si disponible) ;

threadNamestr

Nom du thread ID (si disponible).

La suite est composée des attributs de LogRecord créés
enginestr

Nom du moteur (‘sqlite’, ‘sqlalchemy’, ‘Warp10’, etc.).

See also

ArtimonAPIHandler, ArtimonLocalHendleur
parser(record: logging.LogRecord)str[source]
class dstk.metrics._handlers.GTS(record: logging.LogRecord, dict_value: list, format: List[str])[source]

Bases: object

Classe modélisant un objet GTS (Geo Time Series) Warp10.

commit()str[source]
class dstk.metrics._handlers.HandlerBase(format: List[str] = ['name', 'message'])[source]

Bases: logging.Handler

Classe de base permettant de créer un handler à partir d’une liste de Handler.

Parameters:
formatList[str]

liste des attributs du LogRecord qu’on souhaite récupérer et stocker. Liste des attributs de LogRecord présentés à l’URL :

asctimestr

Timestamps de création du log interprétable humainement ;

createdfloat

Timestamps de création du log ;

filenamestr

Nom du fichier dans lequel a été appelé le logging ;

funcNamestr

Nom de la fonction contenant l’appel du logging ;

levelnamestr

Nom de level d’alerte (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) ;

levelnoint

Numérique associé au level d’alerte ;

messagestr

Message envoyé par le logging (à définir par l’utilisateur) ;

modulestr

Nom du module ;

msecsint

Temps de création de LogRicord (en milliseconde) ;

namestr

Nom du logger (permet d’identifier les différents logger) ;

pathnamestr

Chemin complet du fichier dans lequel a été appelé le logging (si disponible);

processint

Process ID (si disponible) ;

processNamestr

Nom du process ID (si disponible) ;

relativeCreatedfloat

Temps en millisecondes de création de LogRecord, par rapport au temps de chargement du module de logging ;

threadint

Thread ID (si disponible) ;

threadNamestr

Nom du thread ID (si disponible).

La suite est composée des attributs de LogRecord créés
enginestr

Nom du moteur (‘sqlite’, ‘sqlalchemy’, Warp10, etc.).

See also

SQLiteHandler, SQLAlchemyHandler
emit(record: logging.LogRecord)None[source]

Méthode d’envoi des logs à implémenter.

class dstk.metrics._handlers.SQLAlchemyHandler(path_sql: str, format: List[str] = ['name', 'message'], base_name: str = 'logs', **kargs_sql)[source]

Bases: dstk.metrics._handlers.HandlerBase

Classe permettant de créer un handler à partir d’une liste de Handler vers une base interfacée à SQLAlchemy.

Parameters:
path_sqlstr
URL de connexion SQLAlchemy. L’URL de connexion est définie par :

“dialect+driver://usernam:password@host:port/database”

formatList[str]

liste des attributs du LogRecord qu’on souhaite récupérer et stocker. Liste des attributs de LogRecord présentés à l’URL :

asctimestr

Timestamps de création du log interprétable humainement ;

createdfloat

Timestamps de création du log ;

filenamestr

Nom du fichier dans lequel a été appelé le logging ;

funcNamestr

Nom de la fonction contenant l’appel du logging ;

levelnamestr

Nom de level d’alerte (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) ;

levelnoint

Numérique associé au level d’alerte ;

messagestr

Message envoyé par le logging (à définir par l’utilisateur) ;

modulestr

Nom du module ;

msecsint

Temps de création de LogRicord (en milliseconde) ;

namestr

Nom du logger (permet d’identifier les différents logger) ;

pathnamestr

Chemin complet du fichier dans lequel a été appelé le logging (si disponible);

processint

Process ID (si disponible) ;

processNamestr

Nom du process ID (si disponible) ;

relativeCreatedfloat

Temps en millisecondes de création de LogRecord, par rapport au temps de chargement du module de logging ;

threadint

Thread ID (si disponible) ;

threadNamestr

Nom du thread ID (si disponible).

La suite est composée des attributs de LogRecord créés
enginestr

Nom du moteur (‘sqlite’, ‘sqlalchemy’, etc.).

base_namestr

Nom de la base (par dégaut “logs”).

**kargs_sql :
arguments d’entrée au connecteur SQLAlchemy :

sqlalchemy.create_engine(path_sql, **kargs_sql)

See also

SQLiteHandler, timer, timer_class

Notes

Cette classe nécessite SQLAlchemy, si ce package n’est pas présent dans votre environnement il suffit d’ajouter le package “sqlalchemy” au fichier environment.yml et de lancer le script bash bash_install_env.sh dans le répertoire shell du projet.

Examples

Nous allons utiliser timer pour extraire les informations temporelles d’éxécution d’une fonction et les stocker dans une table SQLite interfacée par SQLAlchemy.

>>> import logging
>>> from time import sleep
>>> from dstk.metrics import SQLAlchemyHandler, timer
>>> 
>>> # Création du logger
>>> logging.basicConfig(
>>>     level = logging.INFO,
>>>     handlers = [
>>>         SQLAlchemyHandler(
>>>             path_sql = 'sqlite:///metrics.log',
>>>             format = ['asctime', 'name', 'message', 'threadName']
>>>         )
>>>     ]
>>> )
>>> logger = logging.getLogger('python.metrics.timer')
>>> @timer(logger=logger, delta_time=True)
>>> def function_test(a=1, b=1, sleep_time=0.5):
>>>     r"Docstring de la fonction fonction_test"
>>>     sleep(sleep_time)
>>>     return a+b
>>> 
>>> function_test()
2
>>> function_test(2, 2)
4

Les logs sont stockés dans la base SQLite “metrics.log”.

>>> import sqlite3
>>> import dstk.data import PandasSQL
>>> 
>>> log = PandasSQL(sqlite3.connect("metrics.log"))
>>>
>>> log("SELECT asctime, name, threadName FROM logs;")
                      asctime                  name  threadName
0  2020-04-13T13:31:06.973864  python.metrics.timer  MainThread
1  2020-04-13T13:31:11.469728  python.metrics.timer  MainThread
>>> 
>>> log("SELECT message FROM logs;")
                                             message
0  {"name": "function_test", "dt": "0:00:00.500830"}
1  {"name": "function_test", "dt": "0:00:00.500830"}
emit(record: logging.LogRecord)None[source]

Méthode d’envoi des logs à implémenter.

class dstk.metrics._handlers.SQLiteHandler(path_sql: str, format: List[str] = ['name', 'message'], base_name: str = 'logs', **kargs_sql)[source]

Bases: dstk.metrics._handlers.HandlerBase

Classe permettant de créer un handler à partir d’une liste de Handler vers une base SQLite.

Parameters:
path_sqlstr

chemin vers la base SQLite des logs.

formatList[str]

liste des attributs du LogRecord qu’on souhaite récupérer et stocker. Liste des attributs de LogRecord présentés à l’URL :

asctimestr

Timestamps de création du log interprétable humainement ;

createdfloat

Timestamps de création du log ;

filenamestr

Nom du fichier dans lequel a été appelé le logging ;

funcNamestr

Nom de la fonction contenant l’appel du logging ;

levelnamestr

Nom de level d’alerte (‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) ;

levelnoint

Numérique associé au level d’alerte ;

messagestr

Message envoyé par le logging (à définir par l’utilisateur) ;

modulestr

Nom du module ;

msecsint

Temps de création de LogRicord (en milliseconde) ;

namestr

Nom du logger (permet d’identifier les différents logger) ;

pathnamestr

Chemin complet du fichier dans lequel a été appelé le logging (si disponible);

processint

Process ID (si disponible) ;

processNamestr

Nom du process ID (si disponible) ;

relativeCreatedfloat

Temps en millisecondes de création de LogRecord, par rapport au temps de chargement du module de logging ;

threadint

Thread ID (si disponible) ;

threadNamestr

Nom du thread ID (si disponible).

La suite est composée des attributs de LogRecord créés
enginestr

Nom du moteur (‘sqlite’, ‘sqlalchemy’, etc.).

base_namestr

Nom de la base (par dégaut “logs”).

:**kargs_sql: arguments d’entrée au connecteur
SQLite3 :

sqlite3.connect(path_sql, **kargs_sql)

See also

SQLAlchemyHandler, timer, timer_class

Examples

Nous allons utiliser timer pour extraire les informations temporelles d’éxécution d’une fonction.

>>> import logging
>>> from time import sleep
>>> from dstk.metrics import SQLiteHandler, timer
>>> 
>>> # Création du logger
>>> logging.basicConfig(
>>>     level = logging.INFO,
>>>     handlers = [
>>>         SQLiteHandler(
>>>             path_sql = 'metrics.log',
>>>             format = ['asctime', 'name', 'message', 'threadName']
>>>         )
>>>     ]
>>> )
>>> logger = logging.getLogger('python.metrics.timer')
>>> @timer(logger=logger, delta_time=True)
>>> def function_test(a=1, b=1, sleep_time=0.5):
>>>     r"Docstring de la fonction fonction_test"
>>>     sleep(sleep_time)
>>>     return a+b
>>> 
>>> function_test()
2
>>> function_test(2, 2)
4

Les logs sont stockés dans la base SQLite “metrics.log”.

>>> import sqlite3
>>> from dstk.data import PandasSQL
>>> 
>>> log = PandasSQL(sqlite3.connect("metrics.log"))
>>> 
>>> log("SELECT asctime, name, threadName FROM logs;")
                      asctime                  name  threadName
0  2020-04-13T13:31:06.973864  python.metrics.timer  MainThread
1  2020-04-13T13:31:11.469728  python.metrics.timer  MainThread
>>> 
>>> log("SELECT message FROM logs;")
                                             message
0  {"name": "function_test", "dt": "0:00:00.500830"}
1  {"name": "function_test", "dt": "0:00:00.500830"}
emit(record: logging.LogRecord)None[source]

Méthode d’envoi des logs à implémenter.

class dstk.metrics._handlers.Warp10Handler(token: str, host: str = '127.0.0.1', port: str = '8080', field_value: str = 'value', format: List[str] = ['name', 'msg'], api_version: str = 'v0')[source]

Bases: dstk.metrics._handlers.HandlerBase

Classe de base permettant de créer un handler à partir d’une liste de Handler vers une base interfacée à Warp10.

emit(record: logging.LogRecord)None[source]

Méthode d’envoi des logs à implémenter.