Skip to content

Latest commit

Β 

History

History
525 lines (419 loc) Β· 19.7 KB

File metadata and controls

525 lines (419 loc) Β· 19.7 KB

Scouter Server Go 톡신 ν”„λ‘œν† μ½œ 뢄석

1. 전체 μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   UDP (6100)    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   TCP (6100)    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Agent   β”‚ ──────────────→ β”‚  Scouter Server  β”‚ ←────────────→ β”‚  Client  β”‚
β”‚ (Javaλ“±) β”‚   단방ν–₯ 데이터   β”‚    (Go μ„œλ²„)      β”‚   μ–‘λ°©ν–₯ 톡신    β”‚ (Eclipse β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β”‚  /WebApp)β”‚
     ↑                              ↑                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     └── TCP_AGENT (6100) β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         μ„œλ²„β†’μ—μ΄μ „νŠΈ λͺ…λ Ή 채널
  • UDP 6100: μ—μ΄μ „νŠΈκ°€ μ„œλ²„λ‘œ λ©”νŠΈλ¦­/νŠΈλžœμž­μ…˜ 데이터λ₯Ό 전솑 (단방ν–₯)
  • TCP 6100: ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° + μ—μ΄μ „νŠΈ λͺ…λ Ή 채널 (μ–‘λ°©ν–₯)

2. λ°”μ΄λ„ˆλ¦¬ 직렬화 κΈ°λ³Έ ν˜•μ‹

λͺ¨λ“  톡신은 Big-Endian λ°”μ΄λ„ˆλ¦¬ ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

κΈ°λ³Έ 데이터 νƒ€μž…

νƒ€μž… 크기 μ„€λͺ…
Byte 1 단일 λ°”μ΄νŠΈ
Boolean 1 0x00/0x01
Int16 2 Big-endian 16λΉ„νŠΈ
Int32 4 Big-endian 32λΉ„νŠΈ
Int64 8 Big-endian 64λΉ„νŠΈ
Int3 3 Big-endian 24λΉ„νŠΈ (-8388608 ~ 8388607)
Long5 5 Big-endian 40λΉ„νŠΈ (-549755813888 ~ 549755813887)
Float32 4 IEEE 754 (Int32 λΉ„νŠΈ λ³€ν™˜)
Float64 8 IEEE 754 (Int64 λΉ„νŠΈ λ³€ν™˜)
Text κ°€λ³€ 길이 접두사 + UTF-8 λ¬Έμžμ—΄
Blob κ°€λ³€ 길이 접두사 + λ°”μ΄νŠΈ λ°°μ—΄

Decimal (가변길이 μ •μˆ˜ μ••μΆ•)

μ •μˆ˜ 크기에 따라 μžλ™μœΌλ‘œ λ°”μ΄νŠΈ 수λ₯Ό μ΅œμ ν™”ν•©λ‹ˆλ‹€:

0x00                        β†’ κ°’ = 0        (1λ°”μ΄νŠΈ)
0x01 + int8                 β†’ [-128, 127]   (2λ°”μ΄νŠΈ)
0x02 + int16                β†’ [-32768, 32767] (3λ°”μ΄νŠΈ)
0x03 + int24 (3λ°”μ΄νŠΈ)      β†’ ν™•μž₯ λ²”μœ„      (4λ°”μ΄νŠΈ)
0x04 + int32                β†’ 32λΉ„νŠΈ 전체     (5λ°”μ΄νŠΈ)
0x05 + int40 (5λ°”μ΄νŠΈ)      β†’ ν™•μž₯ λ²”μœ„      (6λ°”μ΄νŠΈ)
0x08 + int64                β†’ 64λΉ„νŠΈ 전체     (9λ°”μ΄νŠΈ)

(internal/protocol/dataoutx.go:155-178, datainx.go:214-251)

Text 길이 인코딩

0              β†’ 빈 λ¬Έμžμ—΄
1~253          β†’ 1λ°”μ΄νŠΈ 길이 + 데이터
255 + uint16   β†’ μ΅œλŒ€ 65535λ°”μ΄νŠΈ
254 + int32    β†’ κ·Έ 이상

3. 맀직 λ°”μ΄νŠΈ (μ—°κ²° 식별)

UDP 맀직 λ°”μ΄νŠΈ

맀직 16μ§„μˆ˜ μš©λ„
CAFE 0x43414645 단일 팩 전솑
CAFN 0x4341464E 볡수 팩 전솑 (N개)
CAFM 0x4341464D MTU λΆ„ν•  νŒ¨ν‚·
JAVA 0x4A415641 Java μ—μ΄μ „νŠΈ ν˜Έν™˜
JAVN 0x4A41564E Java 볡수 팩
JMTU 0x4A4D5455 Java MTU λΆ„ν• 

TCP 맀직 λ°”μ΄νŠΈ

맀직 κ°’ μš©λ„
TCP_AGENT 0xCAFE1001 μ—μ΄μ „νŠΈ TCP μ—°κ²°
TCP_AGENT_V2 0xCAFE1002 μ—μ΄μ „νŠΈ v2 (길이 접두사)
TCP_AGENT_REQ 0xCAFE1011 μ—μ΄μ „νŠΈ λͺ…λ Ή μš”μ²­
TCP_CLIENT 0xCAFE2001 ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²°
TCP_SHUTDOWN 0xCAFE1999 μ„œλ²„ μ’…λ£Œ μ‹ ν˜Έ
TCP_SEND_STACK 0xEDED0001 μŠ€νƒ 트레이슀 전솑

(internal/protocol/netcafe.go)


4. UDP νŒ¨ν‚· ꡬ쑰

단일 팩 (CAFE)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Magic (4B) β”‚ Type (1B) β”‚ Pack Data    β”‚
β”‚ 0x43414645 β”‚           β”‚ (κ°€λ³€)       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

볡수 팩 (CAFN)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Magic (4B) β”‚Count(2B) β”‚Type1(1B) β”‚Data1  β”‚Type2(1B) β”‚Data2  β”‚...
β”‚ 0x4341464E β”‚          β”‚          β”‚       β”‚          β”‚       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”˜

MTU λΆ„ν•  (CAFM) β€” λŒ€μš©λŸ‰ 데이터 λΆ„ν•  전솑

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Magic (4B) β”‚ObjHash(4B)β”‚ PkID(8B) β”‚Total(2B) β”‚Num(2B)  β”‚Blob Data β”‚
β”‚ 0x4341464D β”‚ 객체 ν•΄μ‹œ  β”‚νŒ¨ν‚· 고유ID│총 λΆ„ν• μˆ˜  β”‚ν˜„μž¬ 번호 │데이터     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  • 동일 PkID의 λͺ¨λ“  뢄할이 λ„μ°©ν•˜λ©΄ 재쑰립
  • 10초 νƒ€μž„μ•„μ›ƒ ν›„ λ―Έμ™„μ„± λΆ„ν•  폐기
  • μ΅œλŒ€ 1000개 λ―Έμ™„μ„± νŒ¨ν‚· 보관

(internal/netio/udp/processor.go, multipacket.go)


5. TCP 톡신 ν”Œλ‘œμš°

5.1 TCP 응닡 ν”Œλž˜κ·Έ

ν”Œλž˜κ·Έ κ°’ 의미
FLAG_OK 0x01 성곡
FLAG_NOT_OK 0x02 μ‹€νŒ¨
FLAG_HAS_NEXT 0x03 μΆ”κ°€ 데이터 있음
FLAG_NO_NEXT 0x04 응닡 μ’…λ£Œ
FLAG_FAIL 0x05 였λ₯˜
FLAG_INVALID_SESSION 0x44 μ„Έμ…˜ 무효

(internal/protocol/tcpflag.go)

5.2 ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° (TCP_CLIENT)

CLIENT                           SERVER
  β”‚                                β”‚
  │──── 0xCAFE2001 (4B) ─────────→│  μ—°κ²° 식별
  β”‚                                β”‚
  │──── cmd="LOGIN" (text) ──────→│
  │──── session=0 (int64) ──────→│  첫 μš”μ²­μ€ μ„Έμ…˜ μ—†μŒ
  │──── MapPack {id, pass} ─────→│
  β”‚                                β”‚  인증 처리
  │←── FLAG_HAS_NEXT (0x03) ─────│
  │←── MapPack {session, ...} ───│  μ„Έμ…˜ 토큰 λ°œκΈ‰
  │←── FLAG_NO_NEXT (0x04) ──────│  응닡 μ’…λ£Œ
  β”‚                                β”‚
  │──── cmd="OBJECT_LIST" ──────→│
  │──── session=<token> (int64) ─→│  μ„Έμ…˜ ν† ν°μœΌλ‘œ 인증
  │──── MapPack (query) ────────→│
  β”‚                                β”‚
  │←── FLAG_HAS_NEXT (0x03) ─────│
  │←── Pack data ────────────────│
  │←── FLAG_NO_NEXT (0x04) ──────│  응닡 μ’…λ£Œ
  β”‚                                β”‚
  β”‚         ... 반볡 ...           β”‚

μ„Έμ…˜ 인증

  • LOGIN, SERVER_VERSION, SERVER_TIME λͺ…령은 인증 없이 호좜 κ°€λŠ₯ (FreeCmds)
  • κ·Έ μ™Έ λͺ¨λ“  λͺ…령은 μœ νš¨ν•œ μ„Έμ…˜ 토큰(int64)이 ν•„μš”
  • μ„Έμ…˜μ΄ λ¬΄νš¨ν•˜λ©΄ FLAG_INVALID_SESSION (0x44) λ°˜ν™˜ ν›„ μ—°κ²° μ’…λ£Œ

(internal/protocol/requestcmd.go:324-329)

ν•Έλ“€λŸ¬ νŒ¨ν„΄

func(din *protocol.DataInputX, dout *protocol.DataOutputX, loggedIn bool) {
    // μš”μ²­ 데이터 읽기
    pk, _ := pack.ReadPack(din)
    m := pk.(*pack.MapPack)

    // 처리
    result := m.GetText("key")

    // 응닡 (FLAG_HAS_NEXT + 팩 데이터)
    dout.WriteByte(protocol.FLAG_HAS_NEXT)
    pack.WritePack(dout, responsePack)
    // FLAG_NO_NEXTλŠ” handleClient()κ°€ μžλ™ μΆ”κ°€
}

μ£Όμš” ν΄λΌμ΄μ–ΈνŠΈ λͺ…λ Ή

λͺ…λ Ή μš©λ„
LOGIN 인증, μ„Έμ…˜ 토큰 νšλ“
GET_XML_COUNTER μΉ΄μš΄ν„° μ •μ˜ XML λ‹€μš΄λ‘œλ“œ
OBJECT_LIST_REAL_TIME μ‹€μ‹œκ°„ μ—μ΄μ „νŠΈ λͺ©λ‘
COUNTER_REAL_TIME μ‹€μ‹œκ°„ λ©”νŠΈλ¦­ 쑰회
GET_TEXT_100 ν•΄μ‹œβ†’ν…μŠ€νŠΈ μ—­λ³€ν™˜
TRANX_REAL_TIME μ‹€μ‹œκ°„ νŠΈλžœμž­μ…˜ 데이터
CLOSE μ—°κ²° μ’…λ£Œ

(internal/netio/tcp/server.go:156-222)

5.3 μ—μ΄μ „νŠΈ TCP μ—°κ²° (TCP_AGENT)

μ—μ΄μ „νŠΈ TCP 연결에 λŒ€ν•œ 상세 λ‚΄μš©μ€ tcp-agent-protocol.mdλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.


6. Pack νƒ€μž… 체계

μ£Όμš” Pack νƒ€μž… μ½”λ“œ (1λ°”μ΄νŠΈ)

μ½”λ“œ 이름 μš©λ„ 파일
10 MapPack λ²”μš© Key-Value λ§΅ map_pack.go
21 XLogPack νŠΈλžœμž­μ…˜ 둜그 (40+ ν•„λ“œ) xlog_pack.go
22 DroppedXLogPack λ“œλ‘­λœ νŠΈλžœμž­μ…˜ dropped_xlog_pack.go
26 XLogProfilePack ν”„λ‘œνŒŒμΌλ§ 데이터 xlog_profile_pack.go
27 XLogProfilePack2 ν™•μž₯ ν”„λ‘œνŒŒμΌλ§ 데이터 xlog_profile_pack2.go
31 SpanPack λΆ„μ‚° νŠΈλ ˆμ΄μ‹± 슀팬 span_pack.go
32 SpanContainerPack 슀팬 μ»¨ν…Œμ΄λ„ˆ span_container_pack.go
50 TextPack ν•΄μ‹œβ†’ν…μŠ€νŠΈ λ§€ν•‘ text_pack.go
60 PerfCounterPack μ„±λŠ₯ λ©”νŠΈλ¦­ perf_counter_pack.go
61 StatusPack μƒνƒœ 정보 status_pack.go
62 StackPack μŠ€νƒ 트레이슀 stack_pack.go
63 SummaryPack μš”μ•½ 톡계 summary_pack.go
64 BatchPack 배치 μž‘μ—… 데이터 batch_pack.go
65 InteractionPerfCounterPack μƒν˜Έμž‘μš© λ©”νŠΈλ¦­ interaction_perf_counter_pack.go
70 AlertPack μ•Œλ¦Ό 데이터 alert_pack.go
80 ObjectPack μ—μ΄μ „νŠΈ ν•˜νŠΈλΉ„νŠΈ/메타데이터 object_pack.go

(internal/protocol/pack/pack.go)

Pack μΈν„°νŽ˜μ΄μŠ€

type Pack interface {
    PackType() byte
    Write(o *DataOutputX)
    Read(d *DataInputX) error
}

Pack 직렬화 ν˜•μ‹

[pack_type: 1λ°”μ΄νŠΈ][pack 고유 ν•„λ“œλ“€: κ°€λ³€]

pack.WritePack()은 νƒ€μž… μ½”λ“œ 1λ°”μ΄νŠΈλ₯Ό λ¨Όμ € μ“°κ³ , pack.Write()둜 ν•„λ“œλ₯Ό μ§λ ¬ν™”ν•©λ‹ˆλ‹€. pack.ReadPack()은 νƒ€μž… μ½”λ“œλ₯Ό 읽어 CreatePack()으둜 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ ν›„ pack.Read()λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

(internal/protocol/pack/pack.go:76-99)


7. Value νƒ€μž… 체계

각 ValueλŠ” [type_code:1λ°”μ΄νŠΈ][데이터] ν˜•μ‹μœΌλ‘œ μ§λ ¬ν™”λ©λ‹ˆλ‹€.

Value νƒ€μž… μ½”λ“œ

μ½”λ“œ νƒ€μž… κ΅¬ν˜„μ²΄ μ„€λͺ…
0 NULL NullValue null κ°’
10 BOOLEAN BooleanValue λΆˆλ¦¬μ–Έ
20 DECIMAL DecimalValue 가변길이 μ •μˆ˜
30 FLOAT FloatValue 32λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ 
40 DOUBLE DoubleValue 64λΉ„νŠΈ λΆ€λ™μ†Œμˆ˜μ 
45 DOUBLE_SUMMARY DoubleSummary 톡계 (min/max/avg/count)
46 LONG_SUMMARY LongSummary μ •μˆ˜ 톡계
50 TEXT TextValue λ¬Έμžμ—΄
51 TEXT_HASH TextHashValue ν•΄μ‹œλœ λ¬Έμžμ—΄ (Hexa32)
60 BLOB BlobValue λ°”μ΄νŠΈ λ°°μ—΄
61 IP4ADDR IP4Value IPv4 μ£Όμ†Œ
70 LIST ListValue Value 리슀트
71 ARRAY_INT IntArray int λ°°μ—΄
72 ARRAY_FLOAT FloatArray float λ°°μ—΄
73 ARRAY_TEXT TextArray λ¬Έμžμ—΄ λ°°μ—΄
74 ARRAY_LONG LongArray long λ°°μ—΄
80 MAP MapValue String→Value 맡

(internal/protocol/value/value.go)

MapValue/MapPack 직렬화 ν˜•μ‹

[count: Decimal(κ°€λ³€)][key1: Text][value1: type_byte + value_data][key2: Text][value2: type_byte + value_data]...

8. μ£Όμš” Pack ꡬ쑰 상세

ObjectPack (μ—μ΄μ „νŠΈ ν•˜νŠΈλΉ„νŠΈ, μ½”λ“œ 80)

[ObjType: Text][ObjHash: Decimal][ObjName: Text][Address: Text]
[Version: Text][Alive: Boolean][Wakeup: Decimal][Tags: Value]

(internal/protocol/pack/object_pack.go:26-35)

PerfCounterPack (μ„±λŠ₯ λ©”νŠΈλ¦­, μ½”λ“œ 60)

[Time: Int64][ObjName: Text][TimeType: Byte][Data: Value(MapValue)]

(internal/protocol/pack/perf_counter_pack.go:22-27)

TextPack (λ¬Έμžμ—΄ ν•΄μ‹œ, μ½”λ“œ 50)

[XType: Text][Hash: Int32][Text: Text]

(internal/protocol/pack/text_pack.go:20-24)

XLogPack (νŠΈλžœμž­μ…˜ 둜그, μ½”λ“œ 21)

[EndTime: Decimal][ObjHash: Decimal][Service: Decimal][Txid: Int64]
[ThreadNameHash: Int64][Caller: Int64][Gxid: Int64][Elapsed: Decimal]
[Error: Decimal][Cpu: Decimal][SqlCount: Decimal][SqlTime: Decimal]
[IPAddr: Blob][Kbytes: Decimal][Status: Decimal][Userid: Decimal]
[UserAgent: Decimal][Referer: Decimal][Group: Decimal]
[ApicallCount: Decimal][ApicallTime: Decimal][CountryCode: Text]
[City: Decimal][XType: Byte][Login: Decimal][Desc: Decimal]
[WebHash: Decimal][WebTime: Decimal][HasDump: Byte]
[Text1: Text][Text2: Text][QueuingHostHash: Decimal]
[QueuingTime: Decimal][Queuing2ndHostHash: Decimal]
[Queuing2ndTime: Decimal][Text3: Text][Text4: Text][Text5: Text]
[ProfileCount: Decimal][B3Mode: Boolean][ProfileSize: Decimal]
[DiscardType: Byte][IgnoreGlobalConsequentSampling: Boolean]

(internal/protocol/pack/xlog_pack.go:60-140+)


9. UDP 데이터 흐름

μˆ˜μ‹  흐름

[μ—μ΄μ „νŠΈ UDP νŒ¨ν‚·]
     β”‚
     β–Ό
UDP Server (0.0.0.0:6100)
     β”‚ λ°μ΄ν„°κ·Έλž¨ μˆ˜μ‹  (μ΅œλŒ€ 65535 λ°”μ΄νŠΈ)
     β”‚ 버퍼 볡사 (UDP 경계 보쑴)
     β–Ό
Magic λ°”μ΄νŠΈ νŒŒμ‹± (4λ°”μ΄νŠΈ)
     β”‚
     β”œβ”€ CAFE (0x43414645) β†’ processCafe()
     β”‚   └─ [type:1B][data] β†’ Pack 생성 β†’ λ””μŠ€νŒ¨μ²˜
     β”‚
     β”œβ”€ CAFN (0x4341464E) β†’ processCafeN()
     β”‚   └─ [count:2B][type1:1B][data1][type2:1B][data2]...
     β”‚      β†’ 각 Pack 생성 β†’ λ””μŠ€νŒ¨μ²˜
     β”‚
     β”œβ”€ CAFM (0x4341464D) β†’ processCafeMTU()
     β”‚   └─ [objHash:4B][pkid:8B][total:2B][num:2B][data]
     β”‚      β†’ MultiPacketProcessor 에 μ €μž₯
     β”‚      β†’ λͺ¨λ“  λΆ„ν•  도착 μ‹œ 재쑰립 β†’ λ””μŠ€νŒ¨μ²˜
     β”‚
     β”œβ”€ JAVA β†’ processCafe() (CAFE와 동일 처리)
     β”œβ”€ JAVN β†’ processCafeN() (CAFN와 동일 처리)
     └─ JMTU β†’ processCafeMTU() (CAFM와 동일 처리)

(internal/netio/udp/server.go:43-88, processor.go:55-138)

λ””μŠ€νŒ¨μ²˜ λΌμš°νŒ…

Pack νƒ€μž… ν•Έλ“€λŸ¬ λ™μž‘
ObjectPack (80) AgentManager μ—μ΄μ „νŠΈ 등둝/κ°±μ‹  β†’ ObjectCache
PerfCounterPack (60) PerfCountCore λ©”νŠΈλ¦­ μ €μž₯
XLogPack (21) XLogCore νŠΈλžœμž­μ…˜ 둜그 μ €μž₯
TextPack (50) TextCore ν•΄μ‹œβ†’ν…μŠ€νŠΈ μΊμ‹œ + λ””μŠ€ν¬ μ €μž₯
AlertPack (70) AlertCore μ•Œλ¦Ό 처리

MTU λΆ„ν•  재쑰립

MultiPacketProcessor
β”œβ”€β”€ pending: map[int64]*multiPacket   ← pkid β†’ λΆ„ν•  μ €μž₯μ†Œ
β”‚
β”œβ”€β”€ λΆ„ν•  도착 μ‹œ:
β”‚   β”œβ”€ pending[pkid] μ—†μœΌλ©΄ β†’ μƒˆ multiPacket 생성
β”‚   β”œβ”€ fragments[num] = data μ €μž₯
β”‚   β”œβ”€ receivedCount++
β”‚   └─ receivedCount == total β†’ 재쑰립 μ™„λ£Œ
β”‚       └─ λͺ¨λ“  λΆ„ν•  μˆœμ„œλŒ€λ‘œ ν•©μΉ¨ β†’ μ™„μ„±λœ λ°”μ΄νŠΈ λ°°μ—΄
β”‚
└── 만료 처리:
    └─ 10초 κ²½κ³Όν•œ λ―Έμ™„μ„± νŒ¨ν‚· β†’ 폐기 (μ΅œλŒ€ 1000개 보관)

(internal/netio/udp/multipacket.go:34-105)


10. TCP ν΄λΌμ΄μ–ΈνŠΈ μ™„μ „ν•œ μ΄ˆκΈ°ν™” μ‹œν€€μŠ€

CLIENT                                    SERVER
  β”‚                                         β”‚
  β”‚ ──── 0xCAFE2001 ───────────────────────→│  TCP_CLIENT 맀직
  β”‚                                         β”‚
  β”‚ ── (1) LOGIN ──────────────────────────→│
  β”‚    cmd="LOGIN", session=0               β”‚
  β”‚    MapPack {id:"admin", pass:"...",     β”‚
  β”‚             ip:"...", hostname:"...",   β”‚
  β”‚             version:"..."}              β”‚
  β”‚                                         β”‚  인증 처리
  β”‚ ←── FLAG_HAS_NEXT (0x03) ──────────────│
  β”‚ ←── MapPack {session:token,            β”‚
  β”‚              server_id:...,            β”‚
  β”‚              timezone:...}             β”‚
  β”‚ ←── FLAG_NO_NEXT (0x04) ───────────────│
  β”‚                                         β”‚
  β”‚ ── (2) GET_XML_COUNTER ────────────────→│  μΉ΄μš΄ν„° μ •μ˜ μš”μ²­
  β”‚    cmd="GET_XML_COUNTER", session=token β”‚
  β”‚                                         β”‚
  β”‚ ←── FLAG_HAS_NEXT (0x03) ──────────────│
  β”‚ ←── MapPack {xml: counters.xml λ‚΄μš©}   β”‚
  β”‚ ←── FLAG_NO_NEXT (0x04) ───────────────│
  β”‚                                         β”‚
  β”‚ ── (3) OBJECT_LIST_REAL_TIME ──────────→│  μ—μ΄μ „νŠΈ λͺ©λ‘ 폴링
  β”‚    cmd="OBJECT_LIST_REAL_TIME"          β”‚
  β”‚    session=token                        β”‚
  β”‚                                         β”‚
  β”‚ ←── FLAG_HAS_NEXT (0x03) ──────────────│
  β”‚ ←── ObjectPack (μ—μ΄μ „νŠΈ1) ────────────│
  β”‚ ←── FLAG_HAS_NEXT (0x03) ──────────────│
  β”‚ ←── ObjectPack (μ—μ΄μ „νŠΈ2) ────────────│
  β”‚ ←── FLAG_NO_NEXT (0x04) ───────────────│
  β”‚                                         β”‚
  β”‚         ... 주기적 폴링 반볡 ...         β”‚
  β”‚                                         β”‚
  β”‚ ── (N) CLOSE ──────────────────────────→│  μ—°κ²° μ’…λ£Œ

11. μ„€μ • νŒŒλΌλ―Έν„°

μ„€μ • κΈ°λ³Έκ°’ μ„€λͺ…
net.udp.listen.ip 0.0.0.0 UDP λ°”μΈλ“œ μ£Όμ†Œ
net.udp.listen.port 6100 UDP 포트
net.udp.packet.buffer.size 65535 UDP 버퍼 크기
net.udp.so.rcvbuf.size 8MB UDP μ†ŒμΌ“ μˆ˜μ‹  버퍼
net.tcp.listen.ip 0.0.0.0 TCP λ°”μΈλ“œ μ£Όμ†Œ
net.tcp.listen.port 6100 TCP 포트
net.tcp.client.so.timeout.ms 8000 ν΄λΌμ΄μ–ΈνŠΈ 읽기 νƒ€μž„μ•„μ›ƒ
net.tcp.agent.keepalive.interval.ms 60000 μ—μ΄μ „νŠΈ Keepalive 간격
net.tcp.get.agent.connection.wait.ms 5000 μ—μ΄μ „νŠΈ μ—°κ²° λŒ€κΈ° μ‹œκ°„

12. 전체 데이터 흐름 μš”μ•½

[Java Agent]
    β”‚
    β”œβ”€ UDP ObjectPack (ν•˜νŠΈλΉ„νŠΈ, 30초 μ£ΌκΈ°)
    β”‚   β†’ dispatcher β†’ AgentManager β†’ ObjectCache
    β”‚
    β”œβ”€ UDP PerfCounterPack (λ©”νŠΈλ¦­)
    β”‚   β†’ dispatcher β†’ PerfCountCore β†’ μ €μž₯
    β”‚
    β”œβ”€ UDP XLogPack (νŠΈλžœμž­μ…˜)
    β”‚   β†’ dispatcher β†’ XLogCore β†’ μ €μž₯
    β”‚
    β”œβ”€ UDP TextPack (λ¬Έμžμ—΄ ν•΄μ‹œ)
    β”‚   β†’ dispatcher β†’ TextCore β†’ textCache + λ””μŠ€ν¬
    β”‚
    └─ TCP_AGENT (λͺ…λ Ή 채널)
        ← μ„œλ²„κ°€ λͺ…λ Ή 전솑 (KEEP_ALIVE, THREAD_DUMP λ“±)

[Eclipse Client]
    β”‚
    └─ TCP_CLIENT
        β”œβ”€ LOGIN β†’ μ„Έμ…˜ 토큰 νšλ“
        β”œβ”€ GET_XML_COUNTER β†’ μΉ΄μš΄ν„° μ •μ˜ XML
        β”œβ”€ OBJECT_LIST_REAL_TIME β†’ μ—μ΄μ „νŠΈ λͺ©λ‘ 폴링
        β”œβ”€ COUNTER_REAL_TIME β†’ μ‹€μ‹œκ°„ λ©”νŠΈλ¦­
        β”œβ”€ GET_TEXT_100 β†’ ν•΄μ‹œβ†’ν…μŠ€νŠΈ μ—­λ³€ν™˜
        └─ ... (200+ μ»€λ§¨λ“œ)

13. μ£Όμš” νŠΉμ§• μš”μ•½

ν•­λͺ© λ‚΄μš©
ν”„λ‘œν† μ½œ ν˜•μ‹ λ°”μ΄λ„ˆλ¦¬ (ν…μŠ€νŠΈ 기반 μ•„λ‹˜)
직렬화 Big-endian, 가변길이 μ •μˆ˜ (Decimal)
UDP 포트 6100 (μ—μ΄μ „νŠΈ 데이터 μˆ˜μ‹ )
TCP 포트 6100 (ν΄λΌμ΄μ–ΈνŠΈ + μ—μ΄μ „νŠΈ)
μ΅œλŒ€ UDP νŒ¨ν‚· 65535λ°”μ΄νŠΈ (초과 μ‹œ MTU λΆ„ν• )
맀직 λ°”μ΄νŠΈ 4λ°”μ΄νŠΈ μ„œλͺ… (CAFE λ³€ν˜•, JAVA λ³€ν˜•)
Pack νƒ€μž… 18μ’… (ObjectPack, XLogPack, PerfCounterPack λ“±)
Value νƒ€μž… 16μ’… (Decimal, Text, TextHash, MapValue, ListValue λ“±)
μ••μΆ• 가변길이 μ •μˆ˜ μΈμ½”λ”©λ§Œ μ‚¬μš© (gzip/deflate μ—†μŒ)
μ•”ν˜Έν™” μ—†μŒ (λ„€νŠΈμ›Œν¬ 뢄리에 의쑴)
인증 ID/Password β†’ int64 μ„Έμ…˜ 토큰
Keepalive TCP_AGENT 연결에 KEEP_ALIVE λͺ…λ Ή (60초 간격)
MTU λΆ„ν•  만료 10초
λ°”μ΄λ„ˆλ¦¬ ν˜Έν™˜ Java 원본 Scouter와 μ™„μ „ ν˜Έν™˜