์ผ๋ถ ์ด๋ฒคํธ์ ์๊ด ๊ด๊ณ ID (์ : gs.up.receive
๋ฐ as.up.receive
)๊ฐ ์ค๋ณต๋ฉ๋๋ค.
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๋ ์๋ง๋ ๋ ๋ฒ ์ถ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ปจํ ์คํธ์์์ ๋ ์๊ด 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
์ ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ์์ฒด func ( 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 ๊ธธ์ด๊ฐ ๋ค์๊ณผ ๊ฐ์์ง ํ์ธํฉ๋๋ค. ์ค์ ๋ก 2๊ฐ ์๋๋ผ 1์
๋๋ค.
evt.innerEvent.CorrelationIDs
๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ค๋ณต ์ ๊ฑฐ๋์ง ์์ง๋ง ๋ณ์ ์ด๋ฆ์ ์ ์ธํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก๋ณด๊ธฐ ์ข์ต๋๋ค.
@rvolosatovs ์ ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค (๋ด ์๊ฒฌ ์ฐธ์กฐ). ์๊ด ๊ด๊ณ ID๋ฅผ ๋ณํฉํ๊ธฐ์ํ ํจ์จ์ ์ธ ๊ตฌํ์ ๋ง๋๋ ๋ฐ ์ด๋ฏธ ์๊ฐ์ ๋ณด๋์ผ๋ฏ๋ก ํจ์ฌ ๋ ํจ์จ์ ์ด๊ณ ์ ๋ ฌ๋์ง ์์ ID๋ฅผ ๋ฐํํ๋ @ pgalic96 ์ ์ ์ ๋ ๋งต ๊ตฌํ๊ณผ ๋ณํฉ /
@ pgalic96 ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ค ์ ์์ต๋๊น?
์ด๋ฒ ์ฃผ์๋ ์์ง ์์ ํ์ง ์์๊ณ ๋ด์ผ ์ํ ํ์ ์ถ๊ทผํ์ต๋๋ค. ๋ด์ผ ๋ง๋ฌด๋ฆฌํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
@htdvisser ์ ์์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๋ณ๊ฒฝ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@rvolosatovs ์ ๋ณํฉ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค (๋ด ์๊ฒฌ ์ฐธ์กฐ). ์๊ด ๊ด๊ณ ID๋ฅผ ๋ณํฉํ๊ธฐ์ํ ํจ์จ์ ์ธ ๊ตฌํ์ ๋ง๋๋ ๋ฐ ์ด๋ฏธ ์๊ฐ์ ๋ณด๋์ผ๋ฏ๋ก ํจ์ฌ ๋ ํจ์จ์ ์ด๊ณ ์ ๋ ฌ๋์ง ์์ ID๋ฅผ ๋ฐํํ๋ @ pgalic96 ์ ์ ์ ๋ ๋งต ๊ตฌํ๊ณผ ๋ณํฉ /