NetDevOps常用数据库python实战-influxDB_grafana

概述:

何为时序型数据库?

什么是时间序列数据库,最简单的定义就是数据格式里包含Timestamp字段的数据,比如某一时间环境的温度,CPU的使用率等。但是,有什么数据不包含Timestamp呢?几乎所有的数据其实都可以打上一个Timestamp字段。时间序列数据的更重要的一个属性是如何去查询它,包括数据的过滤,计算等等。

influxdb作为现在主流的时序型数据库,性能强悍,在NetDevOps中主要是用于监控设备。

lnfluxdb是一个开源的分布式时序、时间和指标数据库,使用go语言编写,无需外部依赖。它有三大特性:

  1. 时序性(Time Series):与时间相关的函数的灵活使用(诸如最大、最小、求和等);
  2. 度量(Metrics):对实时大量数据进行计算;
  3. 事件(Event):支持任意的事件数据,换句话说,任意事件的数据我们都可以做操作。

安装InfluxDB:

使用docker-compose安装:

influxdb.yaml:

version: '3'
services:
  # influxdb容器
  influxDB:
    image: "influxdb"
    user: root
    environment:
      - INFLUXDB_DB=devdb   # 数据库
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=Cisc0123
      - INFLUXDB_USER=devdbuser
      - INFLUXDB_USER_PASSWORD=Cisc0123
    volumes:
      - /influx/influxdb:/var/lib/influxdb  # 数据卷
      - /network_protocal/practice_work/influx_db/init-influxdb.sh:/docker-entrypoint-initdb.d/init-influxdb.sh  # 初始化脚本
    networks:
      - influx_net  # 网络
    ports:
      - "8086:8086"
    restart: always

  # 用grafana做图形化界面
  grafana:
    # 镜像名称
    image: "grafana/grafana"
    user: root
    volumes:
      - /influx/grafana:/var/lib/grafana
    networks:
      - influx_net
    # 开放端口
    ports:
      - "3000:3000"
    depends_on:
      - "influxDB"
    restart: always

# 创建网络
networks:
  influx_net:
    driver: bridge

init-influxdb.sh:初始化脚本,配置devdb数据库的存放数据的policy,默认数据存放3周

#!/bin/bash

set -e

influx <<-EOSQL
create retention policy "devdb_rp_policy" on "devdb" duration 3w replication 1 default
EOSQL

在influxdb.yaml同一个文件夹下使用命令,创建容器:

docker-compose -f influxdb.yaml up -d

可以在游览器上输出:http://192.168.0.166:3000/,登陆grafana,账号密码默认是admin/admin。登陆后,连接influxdb:
NetDevOps常用数据库python实战-influxDB_grafana_第1张图片
选择influxdb,并填上相关参数:
NetDevOps常用数据库python实战-influxDB_grafana_第2张图片

influxdb基本操作:

注意:建议最好将基本操作在写yaml文件时就定义完成。

  1. 进入influxdb:

    docker exec -it influx_db_influxDB_1(容器名称) influx
    
  2. 创建数据库:

    create database devdb
    
  3. 使用数据库:

    use devdb
    
  4. 创建普通用户:

    CREATE USER "devdbuser" WITH PASSWORD 'Cisc0123'
    
  5. 创建管理员:

    CREATE USER admin WITH PASSWORD 'Cisc0123' WITH ALL PRIVILEGES
    
  6. 删除用户:

    drop user admin
    
  7. 给与普通用户数据库权限:

     grant all on devdb to devdbuser
    
  8. 创建retention policies

    create retention policy "devdb_rp_policy" on "devdb" duration 3w replication 1 default
    
  9. 修改

    alter retention policy "devdb_rp_policy" on "devdb" duration 30d default
    
  10. 查看retention policies

    show retention policies on "devdb"
    
  11. 删除retention policies

    drop retention policy "devdb_rp_policy" on devdb
    

python实战:

实验目的:
使用SNMP获取MEM利用率,写入influxdb,然后通过influxdb做呈现。

实验设备:
CSR1000v,已经配置好snmp,IP地址为192.168.0.66。

实验步骤:
1.测试与与influxdb的连通性:
influxdb_init_connect.py:

from influxdb import InfluxDBClient

influx_host = '192.168.0.166'
router_ip = "192.168.0.66"
snmp_community = "tcpipro"

if __name__ == '__main__':
    # 使用系统管理员来查询信息
    client = InfluxDBClient(influx_host, 8086, 'admin', 'Cisc0123')

    # 查看数据库 
    print(client.get_list_database())
    # 创建数据库
    print(client.create_database('testdb'))
    print(client.get_list_database())
    # 删除数据库
    print(client.drop_database('testdb'))
    print(client.get_list_database())

    # 使用devdbuser查看信息
    client = InfluxDBClient(influx_host, 8086, 'devdbuser', 'Cisc0123', 'devdb')
    measurements_result = client.query('show measurements;')  # 显示数据库中的表
    print(f"Result: {
       format(measurements_result)}")

    retention_result = client.query('show retention policies on "devdb";')  # 显示数据库中的表
    print(f"Result: {
       format(retention_result)}")

测试结果:能够连接到influxdb中的devdb。
在这里插入图片描述
2.编写snmpv2_get函数:
snmpv2_get.py:

from pysnmp.hlapi import *


def snmpv2_get(ip, community, oid, port=161):
    # varBinds是列表,列表中的每个元素的类型是ObjectType(该类型的对象表示MIB variable)
    error_indication, error_status, error_index, var_binds = next(
        getCmd(SnmpEngine(),
               CommunityData(community),
               UdpTransportTarget((ip, port)),
               ContextData(),
               ObjectType(ObjectIdentity(oid)))
    )

    # 错误处理
    if error_indication:
        print(error_indication)
    elif error_index:
        print('%s at %s' % (
            error_status,
            error_index and var_binds[int(error_index) - 1][0] or '?'
        )
              )
        # 如果返回结果又多行,需要拼接后返回
    result = ""

    for varBind in var_binds:
        # 返回结果
        result = result + varBind.prettyPrint()
        # 返回的为一个元组,OID与字符串结果
        # print(result)
        return result.split("=")[0].strip(), result.split("=")[1].strip()

3.组织好数据格式并向influxdb中写入:
influxdb_monior_router.py:

import time
import datetime
from snmpv2_get import snmpv2_get
from influxdb import InfluxDBClient
from influxdb_init_connect import router_ip, snmp_community, influx_host


client = InfluxDBClient(influx_host, 8086, 'devdbuser', 'Cisc0123', 'devdb')

while True:
    # ----------------------写入内存数据------------------------

    # cpmCPUMemoryUsed
    mem_usage = snmpv2_get(router_ip, snmp_community, "1.3.6.1.4.1.9.9.109.1.1.1.1.12.7", port=161)
    # cpmCPUMemoryFree
    mem_free = snmpv2_get(router_ip, snmp_community, "1.3.6.1.4.1.9.9.109.1.1.1.1.13.7", port=161)
	# 对UTC时间做格式化
    current_time = datetime.datetime.utcnow().isoformat("T")
    
    # 组织数据信息
    cpu_mem_body = [
        {
     
            "measurement": "router_monitor",
            "time": current_time,
            "tags": {
     
                "device_ip": router_ip,
                "device_type": "IOS-XE"
            },
            "fields": {
     
                "mem_usage": int(mem_usage[1]),
                "mem_free": int(mem_free[1]),
            },
        }
    ]
    
    # 每隔五秒收集数据信息,写入到influxdb中
    client.write_points(cpu_mem_body)
    time.sleep(5)

这里的数据信息是一个列表,里面可以存放多个JSON数据:

  1. “measurement”: “router_monitor”,为表名;
  2. “time”: current_time为时间戳,必须存在;
  3. "tags"字段方便搜索;
  4. "fields"字段为记录的数据信息,不能检索。

4.在grafana中创建dashboard:
NetDevOps常用数据库python实战-influxDB_grafana_第3张图片
使用SQL语句,创建dashboard:
NetDevOps常用数据库python实战-influxDB_grafana_第4张图片
语句如下:

SELECT mean("mem_usage")*100/(mean("mem_usage")+mean("mem_free")) FROM "router_monitor" WHERE $timeFilter GROUP  BY time($__interval), "device_ip" fill(none)

参考资料:
https://www.bilibili.com/video/BV1SV41127HU?from=search&seid=13988085653859648559

你可能感兴趣的:(NetDevOps,influxdb,grafana,netdevops,python)