Coucou les développeurs de statoolinfos,
Bravo pour le travail réalisé .
Par contre, vu que l’ensemble de mes outils d’administration de services sont en Python, j’ai retraduit cet outil dans ce langage.
C’est bien plus souple pour moi d’appeler dans mon code Python mes packages Statoolinfos que de devoir faire un appel à une commande système pour le rebranché sur l’outil en Java.
=> Je le met bien au propre et je diffuserais aussi mon outil pour ceux que cela intéresse .
Suite à ma plongé dans le code, j’ai quelques petites remarques sur l’impémentation.
Dans « fr/devinsy/statoolinfos/metrics/http/HttpAccessLogAnalyzer.java » (ligne 392), on a:
result.setTime(LocalDateTime.parse(matcher.group("time"), DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss Z").withLocale(Locale.ENGLISH)));
Or, je suis dans un cas où mes logs ont leur date en français et même que j’ai vu des cas où le mois était écris soit en mot complet, soit en abrégé.
J’ai donc fait une fonction (Python) de ce genre pour gérer tout les cas possible:
def convert_datetime(timetext):
import locale
saved = locale.setlocale(locale.LC_ALL)
try:
locale.setlocale(locale.LC_ALL, 'C')
try:
return datetime.strptime(timetext, "%d/%B/%Y:%H:%M:%S %z")
except ValueError:
pass
try:
return datetime.strptime(timetext, "%d/%b/%Y:%H:%M:%S %z")
except ValueError:
pass
try:
return datetime.strptime(timetext, "%Y/%m/%d %H:%M:%S")
except ValueError:
pass
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
try:
return datetime.strptime(timetext, "%d/%B/%Y:%H:%M:%S %z")
except ValueError:
pass
try:
return datetime.strptime(timetext, "%d/%b/%Y:%H:%M:%S %z")
except ValueError:
pass
print("bad datetime:", timetext, file=sys.stderr)
finally:
locale.setlocale(locale.LC_ALL, saved)
Si je n’arrive pas à décoder la date, je retourne pas de date et donc j’igore la ligne de log.
J’ai corrigé également un autre point, la methode « UserAgent.getOS() » (fichier « fr/devinsy/statoolinfos/metrics/http/UserAgent.java », ligne 109).
En effet, on recherche des mots liés au navigateur et pas au système d’exploitation dans la chaine « source ».
J’ai donc implémenté (en Python) comme cela:
def getOS(self):
if "Android" in self.source:
result = "android"
elif "Mac OS X" in self.source:
result = "macosx"
elif "Linux" in self.source:
result = "gnulinux"
elif "Windows" in self.source:
result = "windows"
else:
result = "other"
return result
A revoir pour améliorer d’autres recherches et que tout le monde aient bien les mêmes OS retour.
Une dernière remarque.
Dans la « moulinette », on sauve dans les « PathCounters »: year, yearMonth, yearWeek, date.
Or, le premier élément « year » n’est jamais exploité.
En effet, notre standard de propriété n’accepte pas des metriques de la forme http.xxxx.2022.year
On a donc un traitement inutile, non exploité, dans l’outil.
A voir si on l’intégre comme une metric supplémentaire ou si on simplifie nos traitements.
Voilà pour mon retour.
En tout cas bravo pour le travail, l’outil est bien fait et le code facile à comprendre.
Par exemple, l’algo sur les « VisitorCounters » est super: j’aurais vraiment galèré à le repenser.
Au final, j’ai vraiment pas mis longtemp pour traduire en Python .
Grand merci à toute l’équipe.
Je ne manquerais pas de vous faire un autre retour sur la suite.
Laurent, un fan de stats.chatons.org