Monitoring DELL avec Prometheus



  • Voici une solution pour superviser un serveur DELL via Prometheus/AlertManager/Grafana.

    Pré-requis

    • Un Kubernetes
    • Un Prometheus
    • Un Alertmanager
    • Un Grafana
    • Dell OMSA avec le SNMP activé.

    Sur votre poste de travail (ou ailleurs), au choix :

    • Golang >= 1.9
    • Docker pour utiliser l’image Docker fournie par Prometheus. J’ai plutôt utilisé directement Go.

    Installer snmp-exporter

    snmp-exporter va vous permettre de faire la passerelle entre votre OMSA qui devrait être accessible via SNMP et votre Prometheus.
    Pour commencer, il faut ajouter les OIDs DELL à snmp-exporter. Voici la procédure :

    • Installez sur votre machine snmp-exporter (il vous faudra peut-être la librairie libsnmp-dev) :
    git clone https://github.com/prometheus/snmp_exporter.git
    cd snmp_exporter/generator
    go get -d
    go build
    
    • Comme indiqué dans la documentation, il faut récupérer quelques mibs pour fonctionner avec les OIDs déjà déclarés dans le fichier generator.yml.
    cd $HOME/.snmp/mibs
    wget ftp://ftp.cisco.com/pub/mibs/v2/v2.tar.gz
    tar xvf v2.tar.gz
    mv auto/mibs/v2/* .
    rm -fr auto
    wget ftp://ftp.servertech.com/Pub/SNMP/sentry3/Sentry3.mib
    wget http://dl.ubnt-ut.com/snmp/UBNT-UniFi-MIB
    wget http://dl.ubnt-ut.com/snmp/UBNT-MIB
    wget ftp://ftp.apc.com/apc/public/software/pnetmib/mib/421/powernet421.mib
    wget https://global.download.synology.com/download/Document/MIBGuide/Synology_MIB_File.zip
    unzip Synology_MIB_File.zip
    wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-SW-IP-FORWARDING-MIB.txt
    wget https://www.paloaltonetworks.com/content/dam/pan/en_US/assets/zip/technical-documentation/snmp-mib-modules/PAN-MIB-MODULES-7.0.zip
    unzip PAN-MIB-MODULES-7.0.zip
    wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-ENTITY-SENSOR-MIB.txt
    wget https://www.arista.com/assets/data/docs/MIBS/ARISTA-SMI-MIB.txt
    wget https://dl.ubnt.com/firmwares/airos-ubnt-mib/ubnt-mib.zip
    unzip ubnt-mib.zip
     rm *.zip *.tar.gz
     wget http://www.circitor.fr/Mibs/Html/D/DELL-RAC-MIB.php
     wget http://www.circitor.fr/Mibs/Mib/D/DELL-SHADOW-MIB.mib
    
    • Dans les MIBs DELL, on retrouve souvent du type DellString qui est traduit par le générateur de snmp-exporter comme du OctetString. Pour que cette supervision fonctionne, il faut passer par du DisplayString. Deux méthodes pour y arriver :
      • patcher le générateur. J’avais commencé comme ça, mais avec la récente mise à jour le patch ne fonctionne plus.
      • remplacer les DellString par du DisplayString. Ce n’est peut-être pas le mieux, mais pour le besoin, ça ira !
    sed -i 's/DellString/DisplayString/g' 10892.mib
    sed -i 's/DellString/DisplayString/g' DELL-RAC-MIB.txt
    
    • On rajoute les OIDs DELL qui nous intéressent dans le fichier generator.yml :
      dell:
        walk:
          - 1.3.6.1.4.1.674.10892 # dell server3
          - 1.3.6.1.4.1.674.10893 # dell storage
    
    • On peut maintenant générer le snmp.yml :
     ./generator generate
    INFO[0000] Loading MIBs from $HOME/.snmp/mibs:/usr/share/snmp/mibs  source="net_snmp.go:122"
    [...]
    INFO[0004] Config written to snmp_exporter/generator/snmp.yml  source="main.go:71"
    
    • Récupérez ce snmp.yml, il faudra le passer en paramètre de snmp-exporter. Plusieurs façons de le faire (stocker ce fichier sur un volume Kubernetes, recréer l’image docker snmp-exporter en y incluant votre version du fichier snmp.yml…). Je pensais le stocker dans un ConfigMap, mais la taille du ConfigMap est limitée et le fichier snmp.yml trop gros !

    J’ai fait le choix de partir sur un InitContainer qui récupère mon fichier snmp.yml sur un serveur web interne pour le stocker dans un volume de type EmptyDir. Mon pod qui partage donc ce volume peut ensuite y accéder. En cas de mise à jour du fichier snmp.yml, un simple delete du pod et votre nouveau fichier sera récupéré.

    Deployment k8s

    Voilà le deployment que j’ai utilisé pour snmp-exporter :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: snmp-exporter
      name: snmp-exporter
      namespace: prometheus
    spec:
      selector:
        matchLabels:
          app: snmp-exporter
      template:
        metadata:
          labels:
            app: snmp-exporter
        spec:
          initContainers:
          - image: debian:stable-slim
            name: get-snmp-conf
            command:
                - /bin/bash
                - -c
                - |
                  apt-get update
                  apt-get install --no-install-recommends -y wget
                  cd /etc/snmp_exporter
                  wget http://votre_serveur/snmp.yml
            volumeMounts:
            - mountPath: /etc/snmp_exporter
              name: snmp-mibs
          containers:
          - image: prom/snmp-exporter:v0.10.0
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /metrics
                port: 9116
                scheme: HTTP
              initialDelaySeconds: 60
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 10
            name: snmp-exporter
            ports:
            - containerPort: 9116
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /metrics
                port: 9116
                scheme: HTTP
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 10
            resources:
              limits:
                cpu: 500m
                memory: 128Mi
              requests:
                cpu: 500m
                memory: 128Mi
            volumeMounts:
            - mountPath: /etc/snmp_exporter
              name: snmp-mibs
          volumes:
          - name: snmp-mibs
            emptyDir: {}
    

    Service k8s

    Pour chaque serveur DELL à superviser, il vous suffira de créer un service Kubernetes comme cet exemple pour que Prometheus scrape les métriques fournies par snmp-exporter.

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        prometheus.io/module: dell
        prometheus.io/path: /snmp
        prometheus.io/scheme: http
        prometheus.io/scrape: "true"
        prometheus.io/target: 1.2.3.4
      name: mon_serveur
    spec:
      ports:
      - port: 9116
        protocol: TCP
        targetPort: 9116
      selector:
        app: snmp-exporter
      clusterIP: None
    

    Configuration Prometheus

    Dans la configuration de votre Prometheus, il faudra rajouter la configuration suivante à la suite des relabel_configs du kubernetes-service-endpoints afin de pouvoir exploiter l’annotation module du service Kubernetes :

      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_module]
        separator: ;
        regex: (.*)
        target_label: __param_module
        replacement: $1
        action: replace
    

    Rechargez la configuration de Prometheus (ou laissez faire votre configmap-reloader).

    Vous devriez voir apparaître votre serveur DELL :

    0_1526566157085_service_dell.png

    TODO : je n’ai pas encore créé mon alerting via AlertManager !

    Grafana

    Voilà une première version de mon dashboard DELL.

    0_1526566185335_Status DELL.png

    0_1526570967341_RAID + hard.png

    Le dashboard est disponible ici.