Pandas: анализ файла журнала: подсчет количества событий на PID процесса - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь проанализировать файл журнала в Pandas. Цель состоит в том, чтобы графически понять, когда процессы перезапускаются (т. Е. Их PID-изменения) и переходят ли они на другой узел в кластере (т. Е. Имя узла и PID-изменение).

Это образец упрощенная версия импортированных журналов:

             datetime    node service severity pid
0 2018-01-01 01:00:00  node01   svc_a    ERROR   1
1 2018-01-01 01:01:00  node01   svc_a    ERROR   1
2 2018-01-01 01:02:00  node02   svc_c     INFO   3
3 2018-01-01 01:03:00  node01   svc_b    ERROR   2
4 2018-01-01 01:04:00  node01   svc_b     INFO   2

Можно создать полный (120 записей) упрощенный фрейм данных следующим образом:

date_rng = pd.date_range(start='1/1/2018 01:00', end='1/1/2018 02:59', freq='T')
node = np.random.choice(['node01', 'node02'], size=len(date_rng))
severity = np.random.choice(['INFO','ERROR'], size=len(date_rng))
service = np.random.choice(['svc_a', 'svc_b', 'svc_c'], size=len(date_rng))
pid = ['0']; pid = pid*len(date_rng)

df = pd.DataFrame(dict(datetime=date_rng, node=node, service=service, severity=severity, pid=pid))

Начальный сценарий будет следующим:

  • svc_a с PID '1' на узле # 1
  • svc_b с PID '2' на узле # 1
  • svc_ c с PID '3' на узле # 2

В 2 часа ночи что-то происходит, и:

  • svc_a перезапускается на узле # 1 (его PID меняется на '11')
  • svc_b переходит на сбой к узлу # 2 (его PID меняется на '22')
  • с svc_ c

ничего не происходит * Мы можем смоделировать вышеизложенное с помощью следующих манипуляций с данными:

# starting point (1am)
df.loc[(df.datetime.dt.hour == 1) & (df["service"] == 'svc_a'), ['node', 'pid']] = ['node01', '1']
df.loc[(df.datetime.dt.hour == 1) & (df["service"] == 'svc_b'), ['node', 'pid']] = ['node01', '2']
df.loc[(df.datetime.dt.hour == 1) & (df["service"] == 'svc_c'), ['node', 'pid']] = ['node02', '3']
# # after restart (2am)
df.loc[(df.datetime.dt.hour == 2) & (df["service"] == 'svc_a'), ['node', 'pid']] = ['node01', '11']
df.loc[(df.datetime.dt.hour == 2) & (df["service"] == 'svc_b'), ['node', 'pid']] = ['node02', '22']

Теперь, просто чтобы дать вам представление о том, чего я пытаюсь достичь в графическом виде, я поделюсь с вами единственной вещью, которую я пчела В состоянии выйти до сих пор.

g = sns.FacetGrid(df, col='node', row='service', hue='severity', height=4, aspect=2)
g = g.map(plt.hist, "datetime")

enter image description here

Итак, с помощью функции Seaborn FacetGrid я могу получить два столбца (по одному для каждого узла) и три ряды (по одному на каждую услугу). Я думаю, что это хорошая раскладка, но я получаю гистограмму, и я не могу получить гистограмму с линейным графиком datetime на x и count событий на y.

Итак, конечный результат должен иметь одинаковую разметку (т. Е. Каждый столбец идентифицирует узел, а каждая строка идентифицирует сервис), но я бы хотел посчитать количество событий, имеющих возможность повторной выборки. столбец datetime и получение двух типов диаграмм:

  • линейный график, где оттенок определяет разные pid значения
  • составной блок-график, где оттенок определяет разные severity значения

Помимо работы в Seaborn, я хотел бы найти способ сделать это с pandas.GroupBy() и matplotlib, так как это даст мне больше гибкости в работе с фактический набор данных.

Относительно pandas.GroupBy(), на данный момент я смог достичь только этого:

df.groupby([pd.Grouper(key='datetime', freq='5T'), 'node', 'service', 'severity', 'pid']).size()

datetime             node    service  severity  pid
2018-01-01 01:00:00  node01  svc_a    ERROR     1      2
                             svc_b    ERROR     2      1
                                      INFO      2      1
                     node02  svc_c    INFO      3      1
2018-01-01 01:05:00  node01  svc_a    ERROR     1      2
                                                      ..
2018-01-01 02:55:00  node01  svc_a    INFO      11     1
                             svc_c    ERROR     0      1
                     node02  svc_b    INFO      22     1
                             svc_c    ERROR     0      1
                                      INFO      0      1
Length: 87, dtype: int64

Что я не могу построить так, как я описано выше.

...