数据监控系统架构与搭建实践- influxdb数据更新

背景

一般来讲 Influxdb的数据是无法更新的。 当tags与time 相同的时候。 原有filed域数据会被覆盖。 这里采用插入前 Field域中的数据整合 来达到更新的目的

Influxdb的概念

首先 这里讲一下Influxdb的几个概念
1、与传统数据库中的名词做比较

InfluxDB中的名词传统数据库中的概念
database数据库
measurement数据库中的表
points表里面的一行数据

Point

Point由时间戳(time)、数据(field)、标签(tags)组成。

Point相当于传统数据库里的一行数据,如下表所示:

Point属性传统数据库中的概念
time每个数据记录时间,是数据库中的主索引(会自动生成)
fields各种记录值(没有索引的属性)也就是记录的值
tags各种有索引的属性

series

所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。series(一般由:retention policy, measurement, tagset就共同组成),其含义如下:

  • 所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。
	insert mytest, server=serverA count=1,name=5 //自动创建表

“mytest”,“server” 是 tags,“count”、“name” 是 fields
fields 中的 value 基本不用于索引

Influxdb更新数据的workaround

json格式举例

json_body = [
   {
       "measurement": "cpu_load_short",
       "tags": {
           "host": "server01",
           "region": "us-west"
       },
       "time": "2009-11-10T23:00:00Z",
       "fields": {
           "value": 0.64
       }
   }
]

Influxdb数据更新Demo示例

        def parse_data(tag):
            
            while len(MySSHClient.data_queue):
                host_for_data, run_time, data_group_list = data_queue.popleft() # 不能popleft空队列

                db_name = 'db_' + host_for_data

                # 获取要创建的表名称、表前缀
                json_body = []
                for data_group in data_group_list:
                    if re.findall(data_group_regex, data_group): # 找到目标数据组(比如CPU统计,内存统计报告等)
                        row_list = data_group.split('\n')  # 获取组里的每条数据 形如 18:39:11        CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest     %idle
                        row_item_list = re.split('\s+', row_list[0]) # 获取由空格隔开的每项数据
                        if row_item_list:
                            if  row_item_list[1:2] == ['CPU']:
                                flag = 'cpu'
                                field_list = row_item_list[2:] # 获取表字段                           
                            else:
                                continue


                        for row in row_list[1:]:
                            row_item_list = re.split('\s+', row.strip()) # 获取由空格隔开的每项数据
                            data_time = row_item_list[0]
                            if run_time == '': # 数据来源docker容器 data_time 格式形如 22:42:30-2018-06-18
                                data_time, runtime = data_time.split('@')
                                date_time = '%s %s' % (runtime, data_time)
                            else:
                                date_time = '%s %s' % (run_time, data_time)
                            timetuple = time.strptime(date_time, '%Y-%m-%d %H:%M:%S')
                            second_for_localtime_utc = int(time.mktime(timetuple)) - 8 * 3600 # UTC时间(秒)
                            timetuple = time.localtime(second_for_localtime_utc)
                            date_for_data = time.strftime('%Y-%m-%d', timetuple)
                            time_for_data = time.strftime('%H:%M:%S', timetuple)
                            datetime_for_data = '%sT%sZ' % (date_for_data, time_for_data)

                            if flag in ('cpu', 'cpu_limit', 'dev', 'netdev', 'enetdev'):
                                measurement = flag + '_' + row_item_list[1]
                                row_item_list = row_item_list[2:]
                            else:
                                measurement = flag
                                row_item_list = row_item_list[1:]

                            temp_dic = {}
                            for i in range(0, len(field_list)):
                                temp_dic[field_list[i]] = float(row_item_list[i])  
                           

                            json_body.append({
                                    "measurement": measurement,
                                    "tags": {
                                        "stuid": tag
                                    },
                                    "time": datetime_for_data,
                                    "fields":temp_dic
                            })

                if json_body:
                    result = self.influx_db_client.write_points(json_body, database=db_name)
                    if result:                        
                        logger.info('往数据库:db_%s 成功写入数据' % host_for_data)
                else:
                    logger.error('获取influxdb json数据为空')

总结

influxdb 的数据读写 可以先集合field域 然后统一写入

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值