diff --git a/go.mod b/go.mod index 9df3022..0cd3998 100644 --- a/go.mod +++ b/go.mod @@ -1,19 +1,28 @@ module github.com/c12s/star -go 1.22.3 +go 1.24.0 require ( github.com/c12s/kuiper v1.0.0 github.com/c12s/magnetar v1.0.0 + github.com/c12s/meridian v1.0.0 github.com/hashicorp/serf v0.10.1 github.com/nats-io/nats.go v1.31.0 github.com/shirou/gopsutil v3.21.11+incompatible - github.com/c12s/meridian v1.0.0 + go.opentelemetry.io/otel v1.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 + go.opentelemetry.io/otel/sdk v1.41.0 ) require ( github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-immutable-radix v1.0.0 // indirect github.com/hashicorp/go-msgpack v0.5.3 // indirect @@ -23,6 +32,12 @@ require ( github.com/hashicorp/memberlist v0.5.0 // indirect github.com/miekg/dns v1.1.41 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect + go.opentelemetry.io/otel/metric v1.41.0 // indirect + go.opentelemetry.io/otel/trace v1.41.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 // indirect ) require ( @@ -31,17 +46,16 @@ require ( github.com/klauspost/compress v1.17.0 // indirect github.com/nats-io/nkeys v0.4.5 // indirect github.com/nats-io/nuid v1.0.1 // indirect - github.com/stretchr/testify v1.8.4 // indirect github.com/tklauser/go-sysconf v0.3.11 // indirect github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/grpc v1.65.0 - google.golang.org/protobuf v1.34.1 + golang.org/x/crypto v0.48.0 // indirect + golang.org/x/net v0.50.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/text v0.34.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 // indirect + google.golang.org/grpc v1.79.1 + google.golang.org/protobuf v1.36.11 ) replace github.com/c12s/magnetar => ../magnetar diff --git a/go.sum b/go.sum index 3f52b9d..e0cc4ea 100644 --- a/go.sum +++ b/go.sum @@ -4,20 +4,33 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= @@ -76,29 +89,49 @@ github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMT github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c= +go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0 h1:mq/Qcf28TWz719lE3/hMB4KkyDuLJIvgJnFGcd0kEUI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.41.0/go.mod h1:yk5LXEYhsL2htyDNJbEq7fWzNEigeEdV5xBF/Y+kAv0= +go.opentelemetry.io/otel/metric v1.41.0 h1:rFnDcs4gRzBcsO9tS8LCpgR0dxg4aaxWlJxCno7JlTQ= +go.opentelemetry.io/otel/metric v1.41.0/go.mod h1:xPvCwd9pU0VN8tPZYzDZV/BMj9CM9vs00GuBjeKhJps= +go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= +go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= +go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= +go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= +go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0= +go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= +golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -113,24 +146,28 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY= +google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/internal/configs/config.go b/internal/configs/config.go index b05a8e3..7d39064 100644 --- a/internal/configs/config.go +++ b/internal/configs/config.go @@ -15,6 +15,8 @@ type Config struct { grpcServerAddress string serfBindAddress string serfBindPort int + jaegerHost string + jaegerGRPCPort string } func (c *Config) NatsAddress() string { @@ -49,6 +51,16 @@ func (c *Config) SerfBindPort() int { return c.serfBindPort } +func (c *Config) JaegerGRPCEndpoint() string { + if c.jaegerHost == "" || c.jaegerGRPCPort == "" { + log.Println("WARNING: Jaeger configuration missing from Config struct!") + return "" + } + endpoint := c.jaegerHost + ":" + c.jaegerGRPCPort + log.Printf("Tracing initialized with endpoint: %s", endpoint) + return endpoint +} + func NewFromEnv() (*Config, error) { registrationReqTimeoutMilliseconds, err := strconv.Atoi(os.Getenv("REGISTRATION_REQ_TIMEOUT_MILLISECONDS")) if err != nil { @@ -65,6 +77,15 @@ func NewFromEnv() (*Config, error) { log.Println(err) serfBindPort = 7946 } + jaegerHost := os.Getenv("JAEGER_HOST") + if jaegerHost == "" { + jaegerHost = "10.5.0.200" + } + + jaegerPort := os.Getenv("JAEGER_GRPC_PORT") + if jaegerPort == "" { + jaegerPort = "4317" + } return &Config{ natsAddress: os.Getenv("NATS_ADDRESS"), registrationReqTimeoutMilliseconds: int64(registrationReqTimeoutMilliseconds), @@ -74,5 +95,7 @@ func NewFromEnv() (*Config, error) { grpcServerAddress: os.Getenv("STAR_ADDRESS"), serfBindAddress: os.Getenv("BIND_ADDRESS"), serfBindPort: serfBindPort, + jaegerHost: jaegerHost, + jaegerGRPCPort: jaegerPort, }, nil } diff --git a/internal/servers/app_config_async.go b/internal/servers/app_config_async.go index 11b2c1d..daf13f9 100644 --- a/internal/servers/app_config_async.go +++ b/internal/servers/app_config_async.go @@ -1,6 +1,7 @@ package servers import ( + "context" "errors" "fmt" "log" @@ -8,6 +9,7 @@ import ( meridianapi "github.com/c12s/meridian/pkg/api" "github.com/c12s/star/internal/services" + "go.opentelemetry.io/otel" ) type AppConfigAsyncServer struct { @@ -28,14 +30,18 @@ func NewAppConfigAsyncServer(client *meridianapi.MeridianAsyncClient, serf *serv } func (c *AppConfigAsyncServer) Serve() { - err := c.client.ReceiveConfig(func(orgId, namespaceName, appName, seccompProfile, strategy string, quotas map[string]float64) error { + err := c.client.ReceiveConfig(func(ctx context.Context, orgId, namespaceName, appName, seccompProfile, strategy string, quotas map[string]float64) error { + tracer := otel.Tracer("star.AppConfigAsyncServer") + ctx, span := tracer.Start(ctx, "ReceiveAppConfig") + defer span.End() + cmd := fmt.Sprintf("Organization: %s\nNamespace: %s\nApplication: %s\nSeccomp profile: %s\nResource quotas:\n", orgId, namespaceName, appName, seccompProfile) for resource, quota := range quotas { cmd += fmt.Sprintf("\t%s: %f\n", resource, quota) } log.Println(cmd) eventName := fmt.Sprintf("app_config-%s-%v", c.nodeId, time.Now().Unix()) - return c.serf.TriggerUserEvent(eventName, cmd, true) + return c.serf.TriggerUserEvent(ctx, eventName, cmd, true) }) if err != nil { log.Println(err) diff --git a/internal/servers/config_async.go b/internal/servers/config_async.go index 9b269d1..15b3494 100644 --- a/internal/servers/config_async.go +++ b/internal/servers/config_async.go @@ -1,6 +1,7 @@ package servers import ( + "context" "errors" "fmt" "log" @@ -10,6 +11,8 @@ import ( "github.com/c12s/star/internal/domain" proto_mapper "github.com/c12s/star/internal/mappers/proto" "github.com/c12s/star/internal/services" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/codes" "google.golang.org/protobuf/proto" ) @@ -34,14 +37,22 @@ func NewConfigAsyncServer(client *kuiperapi.KuiperAsyncClient, configs domain.Co func (c *ConfigAsyncServer) Serve() { err := c.client.ReceiveConfig( - func(protoConfig *kuiperapi.StandaloneConfig, namespace, strategy string) error { + func(ctx context.Context, protoConfig *kuiperapi.StandaloneConfig, namespace, strategy string) error { + tracer := otel.Tracer("star.ConfigAsyncServer") + ctx, span := tracer.Start(ctx, "ReceiveStandaloneConfig") + defer span.End() + config, err := proto_mapper.ApplyStandaloneConfigCommandToDomain(protoConfig, namespace) if err != nil { + span.RecordError(err) return err } + putErr := c.configs.PutStandalone(config) if putErr != nil { return errors.New(putErr.Message()) + span.RecordError(errors.New(putErr.Message())) + span.SetStatus(codes.Error, putErr.Message()) } if strategy == "gossip" { eventName := fmt.Sprintf("standalone-%s-%v", c.nodeId, time.Now().Unix()) @@ -49,11 +60,14 @@ func (c *ConfigAsyncServer) Serve() { if err != nil { return err } - c.serf.TriggerUserEvent(eventName, string(payload), true) + c.serf.TriggerUserEvent(ctx, eventName, string(payload), true) } return nil }, - func(protoConfig *kuiperapi.ConfigGroup, namespace, strategy string) error { + func(ctx context.Context, protoConfig *kuiperapi.ConfigGroup, namespace, strategy string) error { + tracer := otel.Tracer("star.ConfigAsyncServer") + ctx, span := tracer.Start(ctx, "ReceiveConfigGroup") + defer span.End() config, err := proto_mapper.ApplyConfigGroupCommandToDomain(protoConfig, namespace) if err != nil { return err @@ -68,7 +82,7 @@ func (c *ConfigAsyncServer) Serve() { if err != nil { return err } - c.serf.TriggerUserEvent(eventName, string(payload), true) + c.serf.TriggerUserEvent(ctx, eventName, string(payload), true) } return nil }) diff --git a/internal/servers/config_grpc.go b/internal/servers/config_grpc.go index 97a367a..8d17bfb 100644 --- a/internal/servers/config_grpc.go +++ b/internal/servers/config_grpc.go @@ -6,6 +6,8 @@ import ( "github.com/c12s/star/internal/domain" "github.com/c12s/star/internal/mappers/proto" "github.com/c12s/star/pkg/api" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -22,16 +24,32 @@ func NewStarConfigServer(configs domain.ConfigStore) (api.StarConfigServer, erro } func (s *starConfigServer) GetStandaloneConfig(ctx context.Context, req *api.GetReq) (*api.NodeStandaloneConfig, error) { + tracer := otel.Tracer("star.StarConfigServer") + ctx, span := tracer.Start(ctx, "GetStandaloneConfig") + defer span.End() + + span.SetAttributes( + attribute.String("config.org", req.Org), + attribute.String("config.name", req.Name), + attribute.String("config.namespace", req.Namespace), + ) + config, err := s.configs.GetStandalone(req.Org, req.Name, req.Version, req.Namespace) if err := mapError(err); err != nil { + span.RecordError(err) return nil, err } return proto.StandaloneConfigFromDomain(*config) } func (s *starConfigServer) GetConfigGroup(ctx context.Context, req *api.GetReq) (*api.NodeConfigGroup, error) { + tracer := otel.Tracer("star.StarConfigServer") + ctx, span := tracer.Start(ctx, "GetConfigGroup") + defer span.End() + config, err := s.configs.GetGroup(req.Org, req.Name, req.Version, req.Namespace) if err := mapError(err); err != nil { + span.RecordError(err) return nil, err } return proto.ConfigGroupFromDomain(*config) diff --git a/internal/services/cluster_join.go b/internal/services/cluster_join.go index 0fa90b3..5cc21c5 100644 --- a/internal/services/cluster_join.go +++ b/internal/services/cluster_join.go @@ -1,12 +1,15 @@ package services import ( + "context" "fmt" "log" "strings" "github.com/c12s/star/internal/domain" "github.com/nats-io/nats.go" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/propagation" ) type ClusterJoinListener struct { @@ -27,6 +30,11 @@ func NewClusterJoinListener(conn *nats.Conn, serf *SerfAgent, nodeId string, nod func (l *ClusterJoinListener) Listen() { _, err := l.conn.Subscribe(fmt.Sprintf("%s.join", l.nodeId), func(msg *nats.Msg) { + ctx := otel.GetTextMapPropagator().Extract(context.Background(), propagation.HeaderCarrier(msg.Header)) + tracer := otel.Tracer("star") + ctx, span := tracer.Start(ctx, "ClusterJoinHandler") + defer span.End() + params := strings.Split(string(msg.Data), "|") if len(params) != 2 { log.Println("invalid cluster join params: ", params) @@ -36,7 +44,7 @@ func (l *ClusterJoinListener) Listen() { clusterId := params[1] // todo: what happens if the node is not a member of a cluster? //l.serf.Leave() - err := l.serf.Join(address) + err := l.serf.Join(ctx, address) if err != nil { log.Println(err) return diff --git a/internal/services/registration.go b/internal/services/registration.go index facc792..5554b86 100644 --- a/internal/services/registration.go +++ b/internal/services/registration.go @@ -1,6 +1,7 @@ package services import ( + "context" "errors" "fmt" "log" @@ -8,6 +9,7 @@ import ( magnetarapi "github.com/c12s/magnetar/pkg/api" "github.com/c12s/star/internal/domain" + "go.opentelemetry.io/otel" ) type RegistrationService struct { @@ -22,15 +24,19 @@ func NewRegistrationService(client *magnetarapi.RegistrationAsyncClient, nodeIdR } } -func (rs *RegistrationService) Register(maxRetries int8, bindAddress string) error { +func (rs *RegistrationService) Register(ctx context.Context, maxRetries int8, bindAddress string) error { + tracer := otel.Tracer("star") + ctx, span := tracer.Start(ctx, "RegistrationProcess") + defer span.End() + err := rs.nodeIdRepo.PutClusterId("") if err != nil { log.Fatal(err) } - req := rs.buildReq(bindAddress) + req := rs.buildReq(ctx, bindAddress) for attemptsLeft := maxRetries; attemptsLeft > 0; attemptsLeft-- { errChan := make(chan error) - err := rs.tryRegister(req, errChan) + err := rs.tryRegister(ctx, req, errChan) if err == nil { err = <-errChan if err == nil { @@ -42,14 +48,21 @@ func (rs *RegistrationService) Register(maxRetries int8, bindAddress string) err return errors.New("max registration attempts exceeded") } -func (rs *RegistrationService) tryRegister(req *magnetarapi.RegistrationReq, errChan chan<- error) error { - err := rs.client.Register(req, func(resp *magnetarapi.RegistrationResp) { +func (rs *RegistrationService) tryRegister(ctx context.Context, req *magnetarapi.RegistrationReq, errChan chan<- error) error { + tracer := otel.Tracer("star") + ctx, span := tracer.Start(ctx, "RegisterNode") + defer span.End() + + err := rs.client.Register(ctx, req, func(resp *magnetarapi.RegistrationResp) { errChan <- rs.nodeIdRepo.Put(domain.NodeId{Value: resp.NodeId}) }) return err } -func (rs *RegistrationService) buildReq(bindAddress string) *magnetarapi.RegistrationReq { +func (rs *RegistrationService) buildReq(ctx context.Context, bindAddress string) *magnetarapi.RegistrationReq { + _, span := otel.Tracer("star").Start(ctx, "CollectSystemMetrics") + defer span.End() + builder := magnetarapi.NewRegistrationReqBuilder() cpuCores, err := cpuCores() if err == nil { diff --git a/internal/services/serf_agent.go b/internal/services/serf_agent.go index 8a12f9d..38d469f 100644 --- a/internal/services/serf_agent.go +++ b/internal/services/serf_agent.go @@ -3,6 +3,7 @@ package services import ( "bytes" "compress/gzip" + "context" "fmt" "io" "log" @@ -15,6 +16,8 @@ import ( proto_mapper "github.com/c12s/star/internal/mappers/proto" "github.com/hashicorp/serf/serf" nats "github.com/nats-io/nats.go" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" "google.golang.org/protobuf/proto" ) @@ -63,7 +66,11 @@ func NewSerfAgent(cf *configs.Config, nc *nats.Conn, nodeId string, configs doma }, nil } -func (s *SerfAgent) Join(joinAddress string) error { +func (s *SerfAgent) Join(ctx context.Context, joinAddress string) error { + tracer := otel.Tracer("star") + _, span := tracer.Start(ctx, "Serf Join Network Call") + defer span.End() + _, err := s.agent.Join([]string{joinAddress + ":7946"}, false) if err != nil { return err @@ -142,7 +149,13 @@ func (s *SerfAgent) Listen() { // } // TriggerUserEvent is used for no payload splitting -func (s *SerfAgent) TriggerUserEvent(name, payload string, coalesce bool) error { +func (s *SerfAgent) TriggerUserEvent(ctx context.Context, name, payload string, coalesce bool) error { + tracer := otel.Tracer("star.SerfAgent") + _, span := tracer.Start(ctx, "Serf.TriggerUserEvent") + defer span.End() + + span.SetAttributes(attribute.String("event.name", name)) + payloadBytes, err := preparePayload(payload) if err != nil { return err @@ -206,8 +219,13 @@ func handleQuery(ev serf.Event) { // handleUser is used for no payload splitting func handleUser(ev serf.Event, s *SerfAgent) { + tracer := otel.Tracer("star") + ctx, span := tracer.Start(context.Background(), "Handle Serf User Event") + defer span.End() + log.Println("UserEvent handled:", ev.EventType()) if ue, ok := ev.(serf.UserEvent); ok { + span.SetAttributes(attribute.String("event.name", ue.Name)) log.Printf("Event name: %s Event coalescing: %t", ue.Name, ue.Coalesce) payload, err := parsePayload(ue.Payload) if err != nil { @@ -226,7 +244,11 @@ func handleUser(ev serf.Event, s *SerfAgent) { log.Println(err) return } + + _, dbSpan := tracer.Start(ctx, "DB.PutStandalone") putErr := s.configs.PutStandalone(config) + dbSpan.End() + if putErr != nil { log.Println(putErr) } @@ -243,7 +265,11 @@ func handleUser(ev serf.Event, s *SerfAgent) { log.Println(err) return } + + _, dbSpan := tracer.Start(ctx, "DB.PutGroup") putErr := s.configs.PutGroup(config) + dbSpan.End() + if putErr != nil { log.Println(putErr) } @@ -254,16 +280,16 @@ func handleUser(ev serf.Event, s *SerfAgent) { // tag := ue.Name // intended, err := s.checkTags(tag) // if err != nil { - // log.Println(err) + // log.Println(err) // } // if intended { - // payload, err = parsePayload(ue.Payload) - // if err != nil { - // log.Println(err) - // } - // log.Printf("Payload for this node:\n %s", payload) + // payload, err = parsePayload(ue.Payload) + // if err != nil { + // log.Println(err) + // } + // log.Printf("Payload for this node:\n %s", payload) // } else { - // log.Println("Payload not for this node") + // log.Println("Payload not for this node") // } } else { log.Println("Failed to cast to UserEvent") diff --git a/internal/startup/app.go b/internal/startup/app.go index 6e156b3..31432d3 100644 --- a/internal/startup/app.go +++ b/internal/startup/app.go @@ -1,6 +1,7 @@ package startup import ( + "context" "errors" "log" "net" @@ -59,7 +60,8 @@ func (a *app) init() { registrationService := services.NewRegistrationService(registrationClient, nodeIdStore) if !registrationService.Registered() { - err := registrationService.Register(a.config.MaxRegistrationRetries(), a.config.SerfBindAddress()) + ctx := context.Background() + err := registrationService.Register(ctx, a.config.MaxRegistrationRetries(), a.config.SerfBindAddress()) if err != nil { log.Fatalln(err) } @@ -150,6 +152,12 @@ func (a *app) startGrpcServer() error { } func (a *app) Start() error { + shutdownTracing := initTracing( + "star", + a.config.JaegerGRPCEndpoint(), + ) + a.shutdownProcesses = append(a.shutdownProcesses, shutdownTracing) + a.init() err := a.startConfigAsyncServer() diff --git a/internal/startup/tracing.go b/internal/startup/tracing.go new file mode 100644 index 0000000..911f969 --- /dev/null +++ b/internal/startup/tracing.go @@ -0,0 +1,45 @@ +package startup + +import ( + "context" + "log" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.21.0" +) + +func initTracing(serviceName, endpoint string) func() { + exp, err := otlptracegrpc.New( + context.Background(), + otlptracegrpc.WithEndpoint(endpoint), + otlptracegrpc.WithInsecure(), + ) + if err != nil { + log.Fatalf("otlp grpc exporter error: %v", err) + } + + tp := sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exp), + sdktrace.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceName(serviceName), + )), + ) + + otel.SetTracerProvider(tp) + + otel.SetTextMapPropagator( + propagation.NewCompositeTextMapPropagator( + propagation.TraceContext{}, + propagation.Baggage{}, + ), + ) + + return func() { + _ = tp.Shutdown(context.Background()) + } +}