一部のイベント(つまり、 gs.up.receive
とas.up.receive
)の相関IDが重複しています。
ttn-lw-cli events subscribe --gateway-id ...
例えば:
{
"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"
}
correlation_ids
重複はありません
相関IDはおそらく2回追加されます。 これは、コンテキスト内にあるときに相関IDが追加されるイベントパッケージに含まれている可能性があります。
はい
@htdvisser問題は、イベントペイロードからの相関IDがコンテキストの相関IDに追加されているようです。つまり、これがある場合です。
ctx := events.ContextWithCorrelationID(ctx, fmt.Sprintf("gs:uplink:%s", events.NewCorrelationID()))
msg.CorrelationIDs = append(msg.CorrelationIDs, events.CorrelationIDsFromContext(ctx)...)
registerReceiveUplink(ctx, conn.Gateway(), msg)
相関IDは、 ctx
とmsg
( GetCorrelationIDs()
介して)の両方にあるため、イベントで重複しています。
ここで一意性を確認する必要がありますか?
https://github.com/TheThingsNetwork/lorawan-stack/blob/master/pkg/events/events.go#L148
はい、 pkg/events/correlation_context.go
のマージアルゴリズムを独自の関数( mergeCorrelationIDs
)に移動し、それを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)
}
evt.innerEvent.CorrelationIDs
ソートする必要があることに注意してください(これは、コンテキスト内の相関IDがソートされているためです)。
ステータス@ pgalic96は何ですか?
物事で忙しくなり、私は次のような一意性をチェックしました:
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)
}
}
}
まだテストを作成していませんが、 TestCorrelationID
を使用してイベントを作成し、ペイロードに同じTestCorrelationID
して、メッセージのCorrelationIDの長さが次のようになっていることを確認します。確かに1であり、2ではありません。
evt.innerEvent.CorrelationIDs
はこのように重複排除されませんが、変数名は別として、一般的には見栄えがします。
@rvolosatovsのマージアルゴリズムを使用することをお@ pgalic96の提案されたマップ実装とマージ/重複排除すると、効率が大幅に低下し、ソートされていないIDも返されます。
@ pgalic96ステータスを更新できますか?
今週はまだ取り組んでおらず、明日試験後に出社します。 明日それを完成させようとします。
@htdvisserの提案に従ってコードを変更します。
最も参考になるコメント
@rvolosatovsのマージアルゴリズムを使用することをお@ pgalic96の提案されたマップ実装とマージ/重複排除すると、効率が大幅に低下し、ソートされていないIDも返されます。