saphoooo / freebox_exporter

A prometheus exporter for freebox stats
Apache License 2.0
52 stars 26 forks source link

Issue with the last version #23

Closed itwars closed 5 years ago

itwars commented 5 years ago

Hello,

I just update with the last release and got this in the logs file:

2019/08/19 06:13:55 RRD: The API returns an unknown error_code
2019/08/19 06:14:05 json: cannot unmarshal object into Go struct field .data of type []map[string]int
2019/08/19 06:14:15 json: cannot unmarshal object into Go struct field .data of type []map[string]int
saphoooo commented 5 years ago

Ok, I'll have a look to this. Have you more context (freebox adsl vs fiber, etc)?

itwars commented 5 years ago

Freebox Revolution avec la fibre avec la dernière version de firmware. Le message concernant json se répète à intervalle régulier, visiblement c'est la struct rdd :

type rrd struct {
    UID     string `json:"uid,omitempty"`
    Success bool   `json:"success"`
    Msg     string `json:"msg,omitempty"`
    Result  struct {
        DateStart int              `json:"date_start,omitempty"`
        DateEnd   int              `json:"date_end,omitempty"`
        Data      []map[string]int `json:"data,omitempty"`
    } `json:"result"`
    ErrorCode string `json:"error_code"`
}
saphoooo commented 5 years ago

Le problème n'est pas tout à fait là ; en réalité, les freebox fibre ne renvoient pas de statistiques en RRD (il y a déjà eu une issue à ce sujet). Dans la version précédente, lorsque la DB RRD ne revoyait pas de statistiques, je mettais les résultats à 0 partout. Je n'ai pas pris cet aspect en compte lors du refactoring, ce qui explique le message d'erreur. Je vais faire les modifications nécessaire.

itwars commented 5 years ago

Marrant, car j'ai bien les métriques dans grafana image Et ça correspond bien aux graphes donnés par le Freebox !

Si ça peut t'aider, j'ai vu ce repo : https://github.com/trazfr/freebox-exporter/blob/master/fbx/get_metrics.go

saphoooo commented 5 years ago

Il faut que je détermine laquelle des métriques posent problème ; je vais voir pour que la métrique ayant poser problème soit explicitement mentionnée dans le message d'erreur, histoire de réduire le champ d'investigations.

saphoooo commented 5 years ago

Si tu peux faire un essai avec la v1.1.2, elle ne corrige pas de problème mais devrait donner un meilleur message d'erreur

itwars commented 5 years ago

Pareil ...

2019/08/26 20:01:17 freebox_exporter started on port :10001
2019/08/26 20:01:22 json: cannot unmarshal object into Go struct field .data of type []map[string]int
2019/08/26 20:01:32 json: cannot unmarshal object into Go struct field .data of type []map[string]int
2019/08/26 20:01:43 json: cannot unmarshal object into Go struct field .data of type []map[string]int

Aucune autre info ! Je pense que ce message viens des libs Prometheus ?

itwars commented 5 years ago

Je viens de jeter un coup d'oeil dans les logs : Toutes les heures j'ai ça :

RRD: The API returns an unknown error_code: auth_required

L'ensemble des permissions est bien correct (acceptation sur le boitier + gestion des accès dans la freebox)

Et comme indiqué plus haut toutes les 10 min j'ai ça :

json: cannot unmarshal object into Go struct field .data of type []map[string]int
saphoooo commented 5 years ago

Ok, la première n'est pas grave, mais bizarrement le log n'est pas correcte puisque auth_required est une erreur connue. L'app se reconnect d'elle-même. Par contre il faut que j'arrive à déterminer d'où vient le second message. On sait déjà que les deux ne sont pas couplés. Je vais investiguer plus avant.

saphoooo commented 5 years ago

Je viens de faire la v1.1.3, où tu peux ajouter l'option -debug. Il va donner le body de la request (donc ça va être un peu baveux), ce qui nous permettra de voir à quoi ressemble l'objet qui ne passe pas. Mais de toute évidence, ça n'a pas grand impact si ça n'arrive que toutes les 10 minutes (sachant que l'API est appelée toutes les 10 secondes). Il y a des chances que l'ancienne version se comportait de la même manière, j'ai simplement capturé plus d'erreurs dans la nouvelle version. Quoi qu'il en soit, n'hésite pas à poster le nouveau message d'erreur.

itwars commented 5 years ago

Héhéhé nous avons une réponse 👍

2019/09/03 19:08:12 freebox_exporter started on port :10001
2019/09/03 19:08:21 [123 34 115 117 99 99 101 115 115 34 58 116 114 117 101 44 34 114 101 115 117 108 116 34 58 123 34 100 97 116 101 95 115 116 97 114 116 34 58 49 53 54 55 53 51 55 54 55 48 44 34 100 97 116 97 34 58 123 125 44 34 100 97 116 101 95 101 110 100 34 58 49 53 54 55 53 51 55 54 57 56 125 125]
2019/09/03 19:08:21 An error occured with DSL metrics: json: cannot unmarshal object into Go struct field .data of type []map[string]int
2019/09/03 19:08:32 [123 34 115 117 99 99 101 115 115 34 58 116 114 117 101 44 34 114 101 115 117 108 116 34 58 123 34 100 97 116 101 95 115 116 97 114 116 34 58 49 53 54 55 53 51 55 54 57 48 44 34 100 97 116 97 34 58 123 125 44 34 100 97 116 101 95 101 110 100 34 58 49 53 54 55 53 51 55 55 48 57 125 125]
2019/09/03 19:08:32 An error occured with DSL metrics: json: cannot unmarshal object into Go struct field .data of type []map[string]int
2019/09/03 19:08:42 [123 34 115 117 99 99 101 115 115 34 58 116 114 117 101 44 34 114 101 115 117 108 116 34 58 123 34 100 97 116 101 95 115 116 97 114 116 34 58 49 53 54 55 53 51 55 55 48 48 44 34 100 97 116 97 34 58 123 125 44 34 100 97 116 101 95 101 110 100 34 58 49 53 54 55 53 51 55 55 49 56 125 125]
2019/09/03 19:08:42 An error occured with DSL metrics: json: cannot unmarshal object into Go struct field .data of type []map[string]int
saphoooo commented 5 years ago

Pour moi qui lis les bytes comme d'autres lisent la matrice, ça donne ça :

{"success":true,"result":{"date_start":1567537690,"data":{},"date_end":1567537709}}

Donc l'API de la freebox ne renvoie pas de data sur la métrique DSL toutes les 10 minutes. Le struct s'attend à recevoir soit un array de map [string]int, ou que le champ ne soit pas présent. A priori il ne se comporte pas comme s'il n'était pas présent lorsqu'il est vide, il faut que je trouve la parade.

Sinon j'ai corrigé l'output du debug dans v1.1.4

itwars commented 5 years ago

Effectivement la nouvelle version est plus claire pour moi qui ne lit ni byte, ni matrice 😀 Tu ne peux pas faire un test au démarrage pour voir les éléments que te renvoie le boitier ?

saphoooo commented 5 years ago

Le problème, c'est que cette réponse arrive une fois toutes les 60, pour les 59 autres fois il n'y a pas de problème. Dans le struct, j'ai bien :

Data      []map[string]int `json:"data,omitempty"`

Pour que le omitempty fonctionne correctement, je il faudrait que l'API me retourne un array avec une map avec une string nulle et un int nul. Le problème, c'est qu'il ne renvoie pas ce format, et donc le omitempty ne fonctionne pas, d'où l'erreur. A ce stade c'est plus un problème de l'API, mais je vais quand même regarder comment le contourner.

saphoooo commented 5 years ago

Je viens de pousser le v1.1.6