Les ID de corrélation dans certains événements (c'est- gs.up.receive
dire as.up.receive
) sont en double.
ttn-lw-cli events subscribe --gateway-id ...
d. Par example:
{
"name": "gs.up.receive",
"time": "2019-05-10T08:48:36.397803Z",
"identifiers": [
{
"gateway_ids": {
"gateway_id": "tektelic-micro",
"eui": "647FDAFFFE0059AB"
}
}
],
"data": {
"@type": "type.googleapis.com/ttn.lorawan.v3.UplinkMessage",
"raw_payload": "QKogASYAkdgBU2NToyoatD/C",
"settings": {
"data_rate": {
"lora": {
"bandwidth": 125000,
"spreading_factor": 7
}
},
"coding_rate": "4/5",
"frequency": "867900000",
"timestamp": 3375161699
},
"rx_metadata": [
{
"gateway_ids": {
"gateway_id": "tektelic-micro",
"eui": "647FDAFFFE0059AB"
},
"timestamp": 3375161699,
"rssi": 2,
"snr": 10,
"uplink_token": "ChwKGgoOdGVrdGVsaWMtbWljcm8SCGR/2v/+AFmrEOPCs8kM"
}
],
"received_at": "2019-05-10T08:48:36.397329Z",
"correlation_ids": [
"gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
"gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF"
],
"gateway_channel_index": 4
},
"correlation_ids": [
"gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
"gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF",
"gs:conn:01DAGEFV4TBH5K9AVAX86NPDXM",
"gs:uplink:01DAGEW31DQZQNSCQPJ28KGFMF"
],
"origin": "Johans-MacBook-Pro.local"
}
Aucun doublon dans correlation_ids
Les ID de corrélation sont probablement ajoutés deux fois. Cela peut se trouver dans le package d'événements où les ID de corrélation sont ajoutés lorsqu'ils sont dans le contexte.
Oui
@htdvisser le problème semble que les ID de corrélation de la charge utile d'événement sont ajoutés à ceux du contexte, c'est à dire si vous avez ceci;
ctx := events.ContextWithCorrelationID(ctx, fmt.Sprintf("gs:uplink:%s", events.NewCorrelationID()))
msg.CorrelationIDs = append(msg.CorrelationIDs, events.CorrelationIDsFromContext(ctx)...)
registerReceiveUplink(ctx, conn.Gateway(), msg)
Les ID de corrélation sont dupliqués dans l'événement car ils sont tous les deux dans ctx
et dans msg
(via GetCorrelationIDs()
).
Devrions-nous vérifier l'unicité ici?
https://github.com/TheThingsNetwork/lorawan-stack/blob/master/pkg/events/events.go#L148
Oui, nous pouvons déplacer l'algorithme de fusion dans pkg/events/correlation_context.go
dans sa propre fonction ( mergeCorrelationIDs
) et l'utiliser dans pkg/events/events.go
:
if cids := data.GetCorrelationIDs(); len(cids) > 0 {
cids = append(cids[:0:0], cids...)
sort.Strings(cids)
evt.innerEvent.CorrelationIDs = mergeCorrelationIDs(evt.innerEvent.CorrelationIDs, cids)
}
Nous devrions probablement ajouter une note que evt.innerEvent.CorrelationIDs
doit être trié (ce qui est le cas, car les ID de corrélation dans le contexte sont triés).
Quel est le statut @ pgalic96 ?
je me suis occupé de trucs, j'ai vérifié l'unicité, quelque chose comme ça:
if data, ok := data.(interface{ GetCorrelationIDs() []string }); ok {
mapCorrelationIds := make(map[string]struct{})
for _, correlationID := range evt.innerEvent.CorrelationIDs {
mapCorrelationIds[correlationID] = struct{}{}
}
for _, correlationID := range data.GetCorrelationIDs() {
if _, ok := mapCorrelationIds[correlationID]; !ok {
evt.innerEvent.CorrelationIDs = append(evt.innerEvent.CorrelationIDs, correlationID)
}
}
}
Je n'ai pas encore écrit de test, mais cela créerait un événement avec TestCorrelationID
, puis fournirait le même TestCorrelationID
dans la charge utile, puis vérifierait que la longueur des ID de corrélation du message est en effet 1 et non 2.
Mis à part le nom de la variable, il semble généralement bon, bien que le evt.innerEvent.CorrelationIDs
ne soit pas dédupliqué de cette façon
Je préférerais utiliser l'algorithme de fusion de @rvolosatovs (voir mon commentaire). Nous avons déjà passé du temps à faire une implémentation efficace pour fusionner les ID de corrélation, il serait donc dommage que nous fusionnions / dédoublions avec l'implémentation de carte proposée par @ pgalic96 qui est beaucoup moins efficace et renvoie également des ID non triés.
@ pgalic96 pouvez-vous donner une mise à jour du statut?
Je n'ai pas encore travaillé dessus cette semaine, je viens au bureau demain après l'examen. essaiera de le finaliser demain.
Je vais changer le code selon la suggestion de @htdvisser .
Commentaire le plus utile
Je préférerais utiliser l'algorithme de fusion de @rvolosatovs (voir mon commentaire). Nous avons déjà passé du temps à faire une implémentation efficace pour fusionner les ID de corrélation, il serait donc dommage que nous fusionnions / dédoublions avec l'implémentation de carte proposée par @ pgalic96 qui est beaucoup moins efficace et renvoie également des ID non triés.