LINUX.ORG.RU

Утилита или однострочник для подсчёта задержек между событиями в логах

 , , ,


0

1

Есть два типа событий:

Время происхождения события, нужно найти разницы между временами таких событий.

Событие чьё начало и конец залоггированны - нужно найти времена которые заняло событие.

На колене, я наговнякал утилиту на пайтоне:

import datetime                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                            
def from_string(string):                                                                                                                                                                                                                                                                                                                              
    parts = string.split(".")                                                                                                                                                                               
    date_time = parts[0]                                                                                                                                                                                    
    uss = parts[1]                                                                                                                                                                                          
    stamp = datetime.datetime.strptime(date_time, "%Y%m%d-%H:%M:%S")                                                                                                                                        
    stamp += datetime.timedelta(microseconds=int(uss))                                                                                                                                                      
    return stamp                                                                                                                                                                                            
                                                                                                                                                                                                            
def delta_us(lesser, greater):                                                                                                                                                                              
    delta = greater - lesser                                                                                                                                                                                
    return delta.microseconds                                                                                                                                                                               
                                                                                                                                                                                                            
def deltas(stamps, pair=False):                                                                                                                                                                             
    lhs = None                                                                                                                                                                                              
    for s in stamps:                                                                                                                                                                                        
        if lhs is None:                                                                                                                                                                                     
            lhs = s                                                                                                                                                                                         
            continue                                                                                                                                                                                        
                                                                                                                                                                                                            
        delta = delta_us(lhs, s)                                                                                                                                                                            
        yield delta                                                                                                                                                                                         
        if pair:                                                                                                                                                                                            
            lhs = None                                                                                                                                                                                      
        else:                                                                                                                                                                                               
            lhs = s                                                                                                                                                                                         
                                                                                                                                                                                                            
                                                                                                                                                                                                            
if __name__ == "__main__":                                                                                                                                                                                  
    import argparse                                                                                                                                                                                         
    import sys                                                                                                                                                                                              
    parser = argparse.ArgumentParser(description='Converts list of timestamps'                                                                                                                              
                                    ' to delays in us')                                                                                                                                                     
    parser.add_argument('--pair', '-p', action='store_true',                                                                                                                                                
                    help='Group stamps by pair')                                                                                                                                                            
    args = parser.parse_args()                                                                                                                                                                              
                                                                                                                                                                                                            
    stamps = []                                                                                                                                                                                             
                                                                                                                                                                                                            
    for l in sys.stdin:                                                                                                                                                                                     
        stamps.append(from_string(l))                                                                                                                                                                       
                                                                                                                                                                                                            
    for d in deltas(stamps, args.pair):                                                                                                                                                                     
        print (d)                     

Но может есть какое то годное универсальное средство?

Ответ на: комментарий от legolegs

Про dmesg не знаю, journalctl тормоз, да и события часто берутся из pcap дампа например.

onhydro
() автор топика

parts = string.split(".") — для того, чтобы не городить такое, есть параметр maxsplit или str.partition.

Но вообще from_string не нужен, рекомендую dateutil.parser.parse, если ты про него не знаешь. Да, зависимость, но если ты захочешь сделать скрипт более универсальным, например задавать имена файлов, которые надо парсить, то формат таймстемпа указывать не придётся, хватит регулярки для его поиска.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Я за портабельность и юниксвей. Сложнее этот скрипт не будет, лучше код читабельней сделать.

onhydro
() автор топика
Ответ на: комментарий от WitcherGeralt

Кстати про портабельность, можно было и strptime %Z для микросекунд исползовать, вот только он не под всеми версиями венды работает :)

onhydro
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.