物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python ウェブサイトで公開されているネットワーク障害の頻度を解析する

名古屋大学の障害情報一覧にあるネットワーク障害の発生年月日、発生月をPythonで解析してみる。2022/05/14 時点でのHTML構造に対応しているので、ホームページの構造が更新されると使えなくなることをご承知おきください。

データをダウンロード

import urllib.request
import datetime

suffix_urls = [""]
for i in range(2,14):
    suffix_urls.append(f"page{i}/")
datetimes = []
months = []
for suffix_url in suffix_urls:
    url = f"https://icts.nagoya-u.ac.jp/ja/information/trouble/{suffix_url}"
    filename = "a.html"
    urllib.request.urlretrieve(url, filename)

    for line in open(filename,encoding="utf-8").readlines():
        if "ネットワーク障害について" in line:
            datetimes.append(datetime.datetime.strptime(line.replace(" ","")[6:17], '%Y年%m月%d日'))
print(len(datetimes))

横軸に発生年月日、縦軸に障害累積回数を取って、どの時期に障害が多いのか確認する。

import matplotlib.pyplot as plt
plt.plot(list(reversed(datetimes)),[i+1 for i in range(len(datetimes))])
plt.xlabel("発生年月日")
plt.ylabel("障害累積回数")
plt.grid()
plt.show()

2018年は障害発生件数は比較的少ない他は、定常的に障害は発生しているようだ。

月ごとに発生回数のヒストグラムを作って、気温が高い夏に障害が多いのか、気温が低い冬に障害が少ないのか確認する。

plt.hist([dt.month for dt in datetimes], bins=12,range=[0.5,12.5])
plt.xticks([i for i in range(1,13)],[f"{i}月" for i in range(1,13)])
plt.xlabel("発生月")
plt.ylabel("発生回数")
plt.show()

2月は有意に少ない気がするが、他の月で傾向を見出すことはできなかった。

障害の内容が多種多様で、単なるハングアップから電源故障まで含むため、電源故障などの機器関連のみ抜き出せば、もう少し季節変動は見えたかもしれない。

障害発生から回復までの時間を取得する

import urllib.request
import datetime

suffix_urls = [""]
for i in range(2,14):
    suffix_urls.append(f"page{i}/")
datetimes = []
months = []
for suffix_url in suffix_urls:
    url = f"https://icts.nagoya-u.ac.jp/ja/information/trouble/{suffix_url}"
    filename = "a.html"
    urllib.request.urlretrieve(url, filename)

    for line in open(filename,encoding="utf-8").readlines():
        if "ネットワーク障害について" in line:
            url2 = "https://icts.nagoya-u.ac.jp"+line.split("\"")[1]
            filename2 = "b.html"
            urllib.request.urlretrieve(url2, filename2)
            lines2 = open(filename2,encoding="utf-8").readlines()
            for j, line2 in enumerate(lines2):
                if "障害発生時間" in line2:
                    if "~" not in lines2[j+1]:
                        print(lines2[j+2].replace("</p>",""),end="")
                    else:
                        print(lines2[j+1].replace("</p>",""),end="")
print(len(datetimes))

出力結果はここには載せない。気になる人は各自実行してみて欲しい。