package l7 import ( "strconv" "time" "inet.af/netaddr" ) type Protocol uint8 const ( ProtocolTrace Protocol = 200 ProtocolHTTP Protocol = 1 ProtocolPostgres Protocol = 2 ProtocolRedis Protocol = 3 ProtocolMemcached Protocol = 4 ProtocolMysql Protocol = 5 ProtocolMongo Protocol = 6 ProtocolKafka Protocol = 7 ProtocolCassandra Protocol = 8 ProtocolRabbitmq Protocol = 9 ProtocolNats Protocol = 10 ProtocolHTTP2 Protocol = 11 ProtocolDubbo2 Protocol = 12 ProtocolDNS Protocol = 13 ProtocolDM Protocol = 14 ProtocolMariaDB Protocol = 15 ProtocolGrpc Protocol = 16 ProtocolES Protocol = 17 ) func (p Protocol) Int() int { return int(p) } func (p Protocol) String() string { switch p { case ProtocolTrace: return "TRACE" case ProtocolHTTP: return "HTTP" case ProtocolPostgres: return "Postgres" case ProtocolRedis: return "Redis" case ProtocolMemcached: return "Memcached" case ProtocolMysql: return "Mysql" case ProtocolMongo: return "Mongo" case ProtocolKafka: return "Kafka" case ProtocolCassandra: return "Cassandra" case ProtocolRabbitmq: return "Rabbitmq" case ProtocolNats: return "NATS" case ProtocolHTTP2: return "HTTP2" case ProtocolDubbo2: return "Dubbo2" case ProtocolDNS: return "DNS" case ProtocolDM: return "DM" case ProtocolMariaDB: return "Mariadb" case ProtocolGrpc: return "GRPC" case ProtocolES: return "Elasticsearch" } return "UNKNOWN:" + strconv.Itoa(int(p)) } func (p Protocol) ServiceNameString() string { switch p { case ProtocolTrace: return "TRACE" case ProtocolHTTP: return "HTTP" case ProtocolPostgres: return "POSTGRESQL" case ProtocolRedis: return "REDIS" case ProtocolMemcached: return "Memcached" case ProtocolMysql: return "MYSQL" case ProtocolMongo: return "Mongo" case ProtocolKafka: return "KAFKA" case ProtocolCassandra: return "CASSANDRA" case ProtocolRabbitmq: return "Rabbitmq" case ProtocolNats: return "NATS" case ProtocolHTTP2: return "HTTP2" case ProtocolDubbo2: return "Dubbo2" case ProtocolDNS: return "DNS" case ProtocolDM: return "DM" case ProtocolMariaDB: return "MARIA" case ProtocolGrpc: return "GRPC" case ProtocolES: return "ELASTICSEARCH" } return "UNKNOWN:" + strconv.Itoa(int(p)) } type Method uint8 const ( MethodUnknown Method = 0 MethodProduce Method = 1 MethodConsume Method = 2 MethodStatementPrepare Method = 3 MethodStatementClose Method = 4 MethodHttp2ClientFrames Method = 5 MethodHttp2ServerFrames Method = 6 ) func (m Method) String() string { switch m { case MethodUnknown: return "unknown" case MethodProduce: return "produce" case MethodConsume: return "consume" case MethodStatementPrepare: return "statement_prepare" case MethodStatementClose: return "statement_close" case MethodHttp2ClientFrames: return "http2_client_frames" case MethodHttp2ServerFrames: return "http2_server_frames" } return "UNKNOWN:" + strconv.Itoa(int(m)) } type Status int const ( StatusUnknown Status = 0 StatusOk Status = 200 StatusFailed Status = 500 ) func (s Status) String() string { switch s { case StatusUnknown: return "unknown" case StatusOk: return "ok" case StatusFailed: return "failed" } return strconv.Itoa(int(s)) } func (s Status) Http() string { return strconv.Itoa(int(s)) } func (s Status) DNS() string { switch s { case 0: return "ok" case 1: return "format_error" case 2: return "servfail" case 3: return "nxdomain" case 4: return "not_implemented" case 5: return "refused" } return "" } func (s Status) Error() bool { return s == StatusFailed } type RequestData struct { Protocol Protocol Pid uint32 Status Status Duration time.Duration Method Method StatementId uint32 Payload []byte TraceId uint64 TraceStart uint32 TraceEnd uint32 TraceType uint32 EventCount uint32 AssumedAppId string SpanId string StartAt uint64 EndAt uint64 SAddr netaddr.IPPort DAddr netaddr.IPPort ComponentSAddr netaddr.IPPort ComponentDAddr netaddr.IPPort DestAddrString string ParentSpanContext struct { TraceIdFrom string CalledId string InstanceIdFrom string AppIdFrom string SpanIdFrom string TypeFrom string } ErrorMsg string IsTls bool MQTopic string // MQ topic (e.g., Kafka topic) MQKey string // MQ key (e.g., Kafka message key) }