Je souhaite surveiller l'utilisation de la RAM de mon conteneur docker. Maintenant, j'ai trouvé un script en ligne qui génère un fichier txt avec les statistiques comme ceci:
var i
Faites-le fonctionner au démarrage avec mon Synology NAS. Fonctionne bien Je reçois ce fichier:
Traceback (most recent call last):
File "/stats/genstat.py", line 22, in <module>
name, stats = line.strip().split(',')
ValueError: not enough values to unpack (expected 2, got 1)
Maintenant, pour en faire un joli PNG, j'ai ce qui suit:
from pip._internal import main
main(["install", "matplotlib", "numpy","pandas"])
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
log_path = "/stats/docker-logs.txt"
with open(log_path) as f:
raw_data = f.readlines()
nrows = 8
n = len(raw_data) // nrows
data = []
for i in range(n):
start = i * nrows
end = start + nrows - 1
d = raw_data[start:end]
datum = {}
datum['i'] = i
for line in d:
name, stats = line.strip().split(',')
stats = float(stats.split('/')[0].strip()[:-3])
datum[name] = stats
data.append(datum)
data = pd.DataFrame(data)
data['time (hour)'] = data['i'] * 10 / 60
ax = data.drop(columns='i').set_index('time (hour)').plot()
ax.set_ylabel('RAM Usage (MiB)')
ax.figure.savefig('/stats/plot.png')
Ce qui a bien fonctionné au début, mais à l'improviste, cela a cessé de fonctionner et j'ai eu l'erreur suivante:
- Python3, 46.42MiB / 150MiB hassio, 160.8MiB / 3.855GiB Jacket, 255.4MiB / 3.855GiB Radarrnodebug, 96.87MiB / 3.855GiB Sonarrnodebug, 112.8MiB / 3.855GiB Ombii, 212.2MiB / 3.855GiB watchtower, 11.48MiB / 50MiB - Python3, 46.42MiB / 150MiB hassio, 68.34MiB / 3.855GiB Jacket, 258.3MiB / 3.855GiB Radarrnodebug, 101.8MiB / 3.855GiB Sonarrnodebug, 114.8MiB / 3.855GiB Ombii, 212.4MiB / 3.855GiB watchtower, 11.48MiB / 50MiB - Python3, 46.42MiB / 150MiB hassio, 71.06MiB / 3.855GiB Jacket, 262.7MiB / 3.855GiB Radarrnodebug, 102.2MiB / 3.855GiB Sonarrnodebug, 124.1MiB / 3.855GiB Ombii, 217.7MiB / 3.855GiB watchtower, 11.48MiB / 50MiB - Python3, 46.42MiB / 150MiB hassio, 81.38MiB / 3.855GiB Jacket, 262.7MiB / 3.855GiB Radarrnodebug, 102.5MiB / 3.855GiB Sonarrnodebug, 125.1MiB / 3.855GiB Ombii, 217.6MiB / 3.855GiB watchtower, 11.48MiB / 50MiB - Python3, 46.42MiB / 150MiB hassio, 76.55MiB / 3.855GiB Jacket, 269.2MiB / 3.855GiB Radarrnodebug, 103.3MiB / 3.855GiB Sonarrnodebug, 123.8MiB / 3.855GiB Ombii, 219MiB / 3.855GiB watchtower, 11.48MiB / 50MiB - Python3, 46.42MiB / 150MiB hassio, 77.52MiB / 3.855GiB Jacket, 268.4MiB / 3.855GiB Radarrnodebug, 106.2MiB / 3.855GiB Sonarrnodebug, 117.8MiB / 3.855GiB Ombii, 213.1MiB / 3.855GiB watchtower, 11.48MiB / 50MiB -
J'ai effectué un débogage et j'ai découvert que
LOG_FILE="/volume1/docker/docker-logs.txt"
while true;
do
sleep 10m
docker stats --format "{{.Name}}, {{.MemUsage}}" --no-stream >> $LOG_FILE
#echo "-" >> $LOG_FILE
done
est devenu 0 donc plus rien n'a fonctionné (puisqu'il doit sauter le caractère "-") que s'est-il passé et comment puis-je le réparer? J'ai déjà beaucoup essayé en supprimant le caractère "-", en changeant les nrows mais rien n'a vraiment d'importance (pour meeeee)
J'espère que certains pourront vous aider
3 Réponses :
Cette ligne
columns = line.strip().split(',')
if len(columns) == 2:
name, stats = columns
else:
print("Expected name and stats, got", columns)
échoue car votre fichier d'entrée contient une ligne sans virgule. Et c'est très probablement une ligne vierge à la fin. Faites
name, stats = line.strip().split(',')
L'erreur d'impression était un espace réservé pour montrer que quelque chose n'allait pas avec l'entrée. Je ne pouvais pas deviner comment vous vouliez y répondre.
Essayez ceci:
if line.count(',') != 1:
continue
name, stats = line.strip().split(',')
si une ligne contient plus d'une virgule, elle la sautera
La décompression de @IjazAhmadKhan échoue lorsqu'il n'y a pas assez de valeurs ou trop
oui, peut capturer tout le reste dans l'état en utilisant * state
C'est plus pythonique:
if ',' not in line:
continue
name, stats = line.strip().split(',')