Die Korrelations-IDs in einigen Ereignissen (dh gs.up.receive
und as.up.receive
) sind doppelt vorhanden.
ttn-lw-cli events subscribe --gateway-id ...
Beispielsweise:
{
"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"
}
Keine Duplikate in correlation_ids
Die Korrelations-IDs werden wahrscheinlich zweimal hinzugefügt. Dies kann im Ereignispaket sein, in dem Korrelations-IDs hinzugefügt werden, wenn sie sich im Kontext befinden.
Ja
@htdvisser das Problem scheint, dass die Korrelations-IDs aus der Ereignisnutzlast an die des Kontexts angehängt werden, dh wenn Sie dies haben;
ctx := events.ContextWithCorrelationID(ctx, fmt.Sprintf("gs:uplink:%s", events.NewCorrelationID()))
msg.CorrelationIDs = append(msg.CorrelationIDs, events.CorrelationIDsFromContext(ctx)...)
registerReceiveUplink(ctx, conn.Gateway(), msg)
Die Korrelations-IDs sind im Ereignis doppelt vorhanden, da sie sowohl in ctx
als auch in msg
(bis GetCorrelationIDs()
) angegeben sind.
Sollten wir hier die Einzigartigkeit überprüfen?
https://github.com/TheThingsNetwork/lorawan-stack/blob/master/pkg/events/events.go#L148
Ja, wir können den Zusammenführungsalgorithmus in pkg/events/correlation_context.go
in eine eigene Funktion ( mergeCorrelationIDs
) verschieben und diese in 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)
}
Wir sollten wahrscheinlich einen Hinweis hinzufügen, dass evt.innerEvent.CorrelationIDs
sortiert werden muss (was es ist, weil Korrelations-IDs im Kontext sortiert sind).
Wie ist der Status @ pgalic96 ?
Ich war mit Sachen beschäftigt und überprüfte die Einzigartigkeit, so etwas:
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)
}
}
}
Ich habe noch keinen Test geschrieben, aber es würde ein Ereignis mit TestCorrelationID
erstellen und dann das gleiche TestCorrelationID
in der Nutzlast bereitstellen und dann überprüfen, ob die Länge der Korrelations-IDs der Nachricht ist in der Tat 1 und nicht 2.
Abgesehen vom Variablennamen sieht es im Allgemeinen gut aus, obwohl die evt.innerEvent.CorrelationIDs
auf diese Weise nicht dedupliziert werden
Ich würde es vorziehen, den Zusammenführungsalgorithmus von @rvolosatovs zu verwenden (siehe meinen Kommentar). Wir haben bereits viel Zeit damit verbracht, eine effiziente Implementierung zum Zusammenführen von Korrelations-IDs zu erstellen. Daher wäre es eine Schande, wenn wir die von Kartenimplementierung zusammenführen / dedupieren
@ pgalic96 kannst du ein status update geben?
Ich habe diese Woche noch nicht daran gearbeitet und komme morgen nach der Prüfung ins Büro. werde versuchen, es morgen abzuschließen.
Ich werde den Code gemäß dem Vorschlag von @htdvisser ändern .
Hilfreichster Kommentar
Ich würde es vorziehen, den Zusammenführungsalgorithmus von @rvolosatovs zu verwenden (siehe meinen Kommentar). Wir haben bereits viel Zeit damit verbracht, eine effiziente Implementierung zum Zusammenführen von Korrelations-IDs zu erstellen. Daher wäre es eine Schande, wenn wir die von Kartenimplementierung zusammenführen / dedupieren