5.02021-11-21T22:00:19ZTemplates/ApplicationsApp Docker swarmApp Docker swarm## Overview
Monitoring with Docker API, no external scripts need. Use {HOST.DNS} for connect to Docker API.
I'm use SSL client certificate to connect to Docker API (here <https://dker.ru/docs/component-projects/docker-swarm/configure-docker-swarm-for-tls/> you can found HOWTO). You must specify filename of the client's certificate in {$CERT\_FNAME} macro and filename of the client's key in {$KEY\_FNAME}. Certificate and key must be in location for SSL client certificate (see SSLCertLocation in zabbix\_server.conf)
Templates/ApplicationsDocker swarm generalDocker swarm nodesDocker swarm rawDocker swarm services- Docker swarm raw infoHTTP_AGENTdocker.swarm.info.raw00TEXTDocker swarm raw10shttps://{HOST.DNS}:2376/swarm{$CERT_FNAME}{$KEY_FNAME}
- Docker swarm leader nodeDEPENDENTdocker.swarm.nodes.leader00CHARDocker swarm nodesJSONPATH$[?(@.ManagerStatus.Leader== "true")].Description.Hostname.first()docker.swarm.nodes.raw{diff()}=1Docker swarm leader node changedHIGH
- Docker swarm managers nodesDEPENDENTdocker.swarm.nodes.manager0Docker swarm nodesJSONPATH$[?(@.ManagerStatus.Reachability== 'reachable')].ID.length()docker.swarm.nodes.raw
- Docker swarm nodes rawHTTP_AGENTdocker.swarm.nodes.raw00TEXTDocker swarm raw10shttps://{HOST.DNS}:2376/nodes{$CERT_FNAME}{$KEY_FNAME}
- Docker swarm ready nodesDEPENDENTdocker.swarm.nodes.ready0Docker swarm nodesJSONPATH$[?(@.Status.State== 'ready')].ID.length()CUSTOM_VALUE0docker.swarm.nodes.raw{diff()}=1Docker swarm ready nodes changedHIGH
- Docker swarm nodesDEPENDENTdocker.swarm.nodes.total0Docker swarm nodesJSONPATH$[?(@.ID!= 'nothing')].ID.length()CUSTOM_VALUE0docker.swarm.nodes.raw
- Docker swarm services rawHTTP_AGENTdocker.swarm.services.raw5m00TEXTDocker swarm raw10shttps://{HOST.DNS}:2376/services{$CERT_FNAME}{$KEY_FNAME}
- Docker swarm tasks raw infoHTTP_AGENTdocker.swarm.tasks.raw.info00TEXTDocker swarm raw10shttps://{HOST.DNS}:2376/tasks{$CERT_FNAME}{$KEY_FNAME}
- Docker swarm updated atDEPENDENTdocker.swarm.updated_at0unixtimeDocker swarm generalJSONPATH$.UpdatedAtJAVASCRIPTreturn Math.floor(Date.parse(value) / 1000)docker.swarm.info.raw{nodata(5m)}=1Docker swarm no info last 5 minHIGH
Docker swarm containers discoveryHTTP_AGENTdocker.containers.lld10mDISABLED10d{#NAME} CPU usageDEPENDENTdocker.container.cpu[{#ID}]030dJSONPATH$.cpu_stats.cpu_usage.total_usageSIMPLE_CHANGEdocker.container.stats[{#ID}]{#NAME} CPU load %CALCULATEDdocker.container.cpu_load[{#ID}]30dFLOAT!%last("docker.container.cpu[{#ID}]")/last("docker.container.system_cpu[{#ID}]")*last("docker.container.cpu_num[{#ID}]"){#NAME} CPU numberDEPENDENTdocker.container.cpu_num[{#ID}]030dJSONPATH$.cpu_stats.cpu_usage.percpu_usage.length()docker.container.stats[{#ID}]{#NAME} Mem usageDEPENDENTdocker.container.mem[{#ID}]030dBJSONPATH$.memory_stats.usagedocker.container.stats[{#ID}]Raw data container stats {#NAME}HTTP_AGENTdocker.container.stats[{#ID}]2d0TEXT10shttps://{HOST.DNS}:2376/containers/{#ID}/stats?stream=0{$CERT_FNAME}{$KEY_FNAME}{#NAME} CPU system usageDEPENDENTdocker.container.system_cpu[{#ID}]030dJSONPATH$.cpu_stats.system_cpu_usageSIMPLE_CHANGEdocker.container.stats[{#ID}]Raw data container info {#NAME}HTTP_AGENTdocker.container[{#ID}]5m2d0TEXT10shttps://{HOST.DNS}:2376/containers/{#ID}/json{$CERT_FNAME}{$KEY_FNAME}10shttps://{HOST.DNS}:2376/containers/json{$CERT_FNAME}{$KEY_FNAME}{#ID}$.Id{#NAME}$.Names[*].first()Docker swarm nodes discoveryHTTP_AGENTdocker.swarm.nodes.lld1hDISABLED10dNode {#NAME} availabilityDEPENDENTdocker.node.availability[{#ID}]00CHARJSONPATH$.Spec.Availabilitydocker.nodes[{#ID}]Node {#NAME} engine versionDEPENDENTdocker.node.engine_version[{#ID}]00CHARJSONPATH$.Description.Engine.EngineVersiondocker.nodes[{#ID}]Node {#NAME} manager statusDEPENDENTdocker.node.manager_status[{#ID}]00CHARJSONPATH$.ManagerStatus.Reachabilitydocker.nodes[{#ID}]Node {#NAME} resources CPUsDEPENDENTdocker.node.resources.cpu[{#ID}]0HzJSONPATH$.Description.Resources.NanoCPUsdocker.nodes[{#ID}]Node {#NAME} resources memoryDEPENDENTdocker.node.resources.mem[{#ID}]0BJSONPATH$.Description.Resources.MemoryBytesdocker.nodes[{#ID}]Node {#NAME} roleDEPENDENTdocker.node.role[{#ID}]00CHARJSONPATH$.Spec.Roledocker.nodes[{#ID}]Node {#NAME} statusDEPENDENTdocker.node.status[{#ID}]00CHARJSONPATH$.Status.Statedocker.nodes[{#ID}]Raw data node {#NAME} at {#ADDR}HTTP_AGENTdocker.nodes[{#ID}]5m0TEXT10shttps://{HOST.DNS}:2376/nodes/{#ID}{$CERT_FNAME}{$KEY_FNAME}10shttps://{HOST.DNS}:2376/nodes{$CERT_FNAME}{$KEY_FNAME}{#ADDR}$.Status.Addr{#ID}$.ID{#NAME}$.Description.HostnameDocker swarm services discoveryHTTP_AGENTdocker.swarm.services.lld5m10dDocker swarm uptime {#SERVICE}DEPENDENTdocker.swarm.service.uptime[{#SERVICE}]0uptimeDocker swarm servicesJSONPATH$[?(@.ID == '{#ID}')].UpdatedAt.first()JAVASCRIPTreturn Math.floor((Date.now() - Date.parse(value)) / 1000)docker.swarm.services.raw{last()}<600Docker swarm updated service {#SERVICE}WARNINGDocker swarm number running tasks for {#SERVICE}DEPENDENTdocker.swarm.tasks.running[{#SERVICE}]0Docker swarm servicesJSONPATH$[?(@.Status.State == 'running' && @.ServiceID == '{#ID}')].length()docker.swarm.tasks.raw.info{last()}=0RECOVERY_EXPRESSION{avg(30m)}<1Docker swarm no running tasks for {#SERVICE}AVERAGEYES{diff()}=1Docker swarm no running tasks for {#SERVICE} changedAVERAGEYES20shttps://{HOST.DNS}:2376/services{$CERT_FNAME}{$KEY_FNAME}{#ID}$.ID{#SERVICE}$.Spec.Name{#STACK}$.Spec.Labels['com.docker.stack.namespace']{$CERT_FNAME}dclient-cert.pem{$KEY_FNAME}dclient-key.pem