Отсутствие данных при записи данных в базу данных - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть программа, которая записывает данные в InfluxDB каждую секунду, и я обнаружил некоторую ошибку. Иногда одна секунда отсутствует в БД. Данные не пропускаются регулярно, но это примерно одна пропущенная секунда в 1 минуту.

Моя программа выглядит так:

def monitoring():           
try:
    client = InfluxDBClient(host=IpAdress, port="8086", database="DB")
    print("Connected to InfluxDB")      
except:
    print('{} :Can`t connect to the database, with error {}'.format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), exc_info()[0]))

#=============================================== GPIO ==========================================
GPIO.setwarnings(False)                     # Ignore warning for now
GPIO.setmode(GPIO.BCM)                    # Use physical pin numbering
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                 
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                 
GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                 
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                 
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)                 
GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  
last_update = int(time.time())
while True:
    if GPIO.input(27):
        run_01 = 1
    elif GPIO.input(18):
        run_01 = 1
    else:                
        run_01 = 0
#checking all GPIO if they are UP or DOWN
    now_time = int(time.time())
    if last_update < now_time:        
        #===============================================Write_Data==========================================
        json_writer = [ 
            {
                "measurement": "measurement",
                "tags": {
                    "some_tag": "{}".format(some_tag)
                },
                    "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), 
                    "fields": {
                        "data_to_DB": data_to_DB
                    }
            }
        ]
        try:
            client.write_points(json_writer)
        except:
            print('{} :Writing data to database error: {}'.format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"), exc_info()[0]))
        last_update = now_time
client.close()

Программа работает на Rpi 3 или Rpi 4 внутри Docker контейнер с Python 3.7.3 и InfluxDB 1.7.7

Я думаю, что это все, но если вам нужна дополнительная конкретная c информация, пожалуйста, напишите мне, и я обновлю свой вопрос.

У вас есть какой-нибудь совет, как решить эту проблему?

РЕДАКТИРОВАТЬ:

Необработанные данные временных отметок, другой столбец - это просто строки и 0 или 1:

1580460015000029184
1580460016000039168
1580460017000029184
1580460018000050176
1580460019000039936
1580460020000034048
1580460021000029184
1580460022000039168
1580460023000036864
1580460024000029952
1580460025000036096
1580460026000036096
1580460027000029184
1580460028000050176
1580460029000044032
1580460032878979072
1580460033127377152
1580460034000029184
1580460035000040960
1580460036000046848
1580460037000040960
1580460038000033024
1580460039000033024
1580460040000033024
1580460041000026880
1580460042000040960
1580460043000026112
1580460044000036096
1580460045000039168
1580460046000039936
1580460047000036096
1580460048000043008
1580460049000026880
1580460050000049152
1580460051000032000
1580460052000045056
1580460053000036096
1580460054000039168
1580460055000029952
1580460056000039168
1580460057000033024
1580460058000046848
1580460059000049152
1580460060000035072
1580460061000036096
1580460062000035072
1580460063000039168
1580460064000029952
1580460065000039168
1580460066000039168
1580460067000043008
1580460068000036864
1580460069000049152
1580460070000036096
1580460071000029184
1580460072000040960
1580460073000043008
1580460074000033024

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Спасибо за подсказку.

Я испробовал все ваши советы.

Основная проблема: иногда запись занимает около 3 секунд. Обычно составляет около 0,03 секунды.

В противном случае я решаю эту проблему, перемещая client.write_points(json_writer) в другой поток.

0 голосов
/ 10 февраля 2020

ИМХО 2 значения / отметка времени отсутствуют:

1580460029000044032
1580460030...
1580460031...
1580460032878979072

Интересные факты:

  • некоторые данные имеют ровно 1-секундную разницу с точностью до наносекунды (я не верю, что python в пространстве пользователя может иметь такую ​​точность)
1580460038000033024
1580460039000033024
1580460040000033024
  • миллисекунда обычно равна 000

Я бы

  • попробуйте поиграть с time_precision:
client.write_points(json_writer, time_precision=?)
  • сравнить отправленную отметку времени с сохраненной отметкой времени
  • проверить, что отсутствующие отметки времени были опубликованы (возможно, есть задача, например, cron с более высоким приоритетом, поэтому выполнение принятого кода только задерживается) - проверьте, есть ли временная диаграмма в отсутствующих временных метках
...