diff --git a/LICENSES/github.com/jsimonetti/rtnetlink/v2/LICENSE.md b/LICENSES/github.com/jsimonetti/rtnetlink/v2/LICENSE.md deleted file mode 100644 index 9c073eb9a..000000000 --- a/LICENSES/github.com/jsimonetti/rtnetlink/v2/LICENSE.md +++ /dev/null @@ -1,10 +0,0 @@ -MIT License -=========== - -Copyright (C) 2016 Jeroen Simonetti - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/collector/internal/controller.go b/collector/internal/controller.go index dc10eac58..d414ee5e0 100644 --- a/collector/internal/controller.go +++ b/collector/internal/controller.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/ebpf-profiler/internal/controller" "go.opentelemetry.io/ebpf-profiler/reporter" "go.opentelemetry.io/ebpf-profiler/times" + "go.opentelemetry.io/ebpf-profiler/vc" ) // Controller is a bridge between the Collector's [receiverprofiles.Profiles] @@ -26,6 +27,8 @@ func NewController(cfg *controller.Config, cfg.MonitorInterval, cfg.ProbabilisticInterval) rep, err := reporter.NewCollector(&reporter.Config{ + Name: "otelcol-ebpf-profiler", + Version: vc.Version(), MaxRPCMsgSize: 32 << 20, // 32 MiB MaxGRPCRetries: 5, GRPCOperationTimeout: intervals.GRPCOperationTimeout(), diff --git a/go.mod b/go.mod index af5d7dc32..34081a49f 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/elastic/go-freelru v0.16.0 github.com/elastic/go-perf v0.0.0-20241029065020-30bec95324b8 github.com/google/uuid v1.6.0 - github.com/jsimonetti/rtnetlink/v2 v2.0.3 github.com/klauspost/compress v1.18.0 github.com/mdlayher/kobject v0.0.0-20200520190114-19ca17470d7d github.com/minio/sha256-simd v1.0.1 @@ -60,6 +59,7 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/josharian/native v1.1.0 // indirect + github.com/jsimonetti/rtnetlink/v2 v2.0.3 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/mdlayher/netlink v1.7.2 // indirect diff --git a/go.sum b/go.sum index 398b1b5fa..837306fdc 100644 --- a/go.sum +++ b/go.sum @@ -1,107 +1,37 @@ -github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= -github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= -github.com/aws/aws-sdk-go-v2 v1.36.4 h1:GySzjhVvx0ERP6eyfAbAuAXLtAda5TEy19E5q5W8I9E= -github.com/aws/aws-sdk-go-v2 v1.36.4/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0= github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= -github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM= -github.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g= -github.com/aws/aws-sdk-go-v2/config v1.29.15 h1:I5XjesVMpDZXZEZonVfjI12VNMrYa38LtLnw4NtY5Ss= -github.com/aws/aws-sdk-go-v2/config v1.29.15/go.mod h1:tNIp4JIPonlsgaO5hxO372a6gjhN63aSWl2GVl5QoBQ= -github.com/aws/aws-sdk-go-v2/config v1.29.16 h1:XkruGnXX1nEZ+Nyo9v84TzsX+nj86icbFAeust6uo8A= -github.com/aws/aws-sdk-go-v2/config v1.29.16/go.mod h1:uCW7PNjGwZ5cOGZ5jr8vCWrYkGIhPoTNV23Q/tpHKzg= github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0= github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8= -github.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.67/go.mod h1:p3C44m+cfnbv763s52gCqrjaqyPikj9Sg47kUVaNZQQ= -github.com/aws/aws-sdk-go-v2/credentials v1.17.68 h1:cFb9yjI02/sWHBSYXAtkamjzCuRymvmeFmt0TC0MbYY= -github.com/aws/aws-sdk-go-v2/credentials v1.17.68/go.mod h1:H6E+jBzyqUu8u0vGaU6POkK3P0NylYEeRZ6ynBpMqIk= -github.com/aws/aws-sdk-go-v2/credentials v1.17.69 h1:8B8ZQboRc3uaIKjshve/XlvJ570R7BKNy3gftSbS178= -github.com/aws/aws-sdk-go-v2/credentials v1.17.69/go.mod h1:gPME6I8grR1jCqBFEGthULiolzf/Sexq/Wy42ibKK9c= github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0= github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31 h1:oQWSGexYasNpYp4epLGZxxjsDo8BMBh6iNWkTXQvkwk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.31/go.mod h1:nc332eGUU+djP3vrMI6blS0woaCfHTe3KiSQUVTMRq0= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.35 h1:o1v1VFfPcDVlK3ll1L5xHsaQAFdNtZ5GXnNR7SwueC4= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.35/go.mod h1:rZUQNYMNG+8uZxz9FOerQJ+FceCiodXvixpeRtdESrU= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.35 h1:R5b82ubO2NntENm3SAm0ADME+H630HomNJdgv+yZ3xw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.35/go.mod h1:FuA+nmgMRfkzVKYDNEqQadvEMxtxl9+RLT9ribCwEMs= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.35 h1:th/m+Q18CkajTw1iqx2cKkLCij/uz8NMwJFPK91p2ug= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.35/go.mod h1:dkJuf0a1Bc8HAA0Zm2MoTGm/WDC18Td9vSbrQ1+VqE8= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 h1:GMYy2EOWfzdP3wfVAGXBNKY5vK4K8vMET4sYOYltmqs= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36/go.mod h1:gDhdAV6wL3PmPqBhiPbnlS447GoWs8HTTOYef9/9Inw= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.2 h1:BCG7DCXEXpNCcpwCxg1oi9pkJWH2+eZzTn9MY56MbVw= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.2/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.3 h1:VHPZakq2L7w+RLzV54LmQavbvheFaR2u1NomJRSEfcU= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.3/go.mod h1:DX1e/lkbsAt0MkY3NgLYuH4jQvRfw8MYxTe9feR7aXM= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 h1:nAP2GYbfh8dd2zGZqFRSMlq+/F6cMPBUuCsGAMkN074= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4/go.mod h1:LT10DsiGjLWh4GbjInf9LQejkYEhBgBCjLG5+lvk4EE= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.16 h1:/ldKrPPXTC421bTNWrUIpq3CxwHwRI/kpc+jPUTJocM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.16/go.mod h1:5vkf/Ws0/wgIMJDQbjI4p2op86hNW6Hie5QtebrDgT8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.16 h1:2HuI7vWKhFWsBhIr2Zq8KfFZT6xqaId2XXnXZjkbEuc= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.16/go.mod h1:BrwWnsfbFtFeRjdx0iM1ymvlqDX1Oz68JsQaibX/wG8= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM9na4cvXax9dyLitn8EYBRl8Ak4XtG4= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.80.0 h1:fV4XIU5sn/x8gjRouoJpDVHj+ExJaUk4prYF+eb6qTs= -github.com/aws/aws-sdk-go-v2/service/s3 v1.80.0/go.mod h1:qbn305Je/IofWBJ4bJz/Q7pDEtnnoInw/dGt71v6rHE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.80.1 h1:xYEAf/6QHiTZDccKnPMbsMwlau13GsDsTgdue3wmHGw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.80.1/go.mod h1:qbn305Je/IofWBJ4bJz/Q7pDEtnnoInw/dGt71v6rHE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.80.2 h1:T6Wu+8E2LeTUqzqQ/Bh1EoFNj1u4jUyveMgmTlu9fDU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.80.2/go.mod h1:chSY8zfqmS0OnhZoO/hpPx/BHfAIL80m77HwhRLYScY= github.com/aws/aws-sdk-go-v2/service/s3 v1.80.3 h1:jBOwbbIQlfZG079E0YEnfipULNr7wnXbG2gwJyG9hrc= github.com/aws/aws-sdk-go-v2/service/s3 v1.80.3/go.mod h1:kUklwasNoCn5YpyAqC/97r6dzTA1SRKJfKq16SXeoDU= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.4 h1:EU58LP8ozQDVroOEyAfcq0cGc5R/FTZjVoYJ6tvby3w= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.4/go.mod h1:CrtOgCcysxMvrCoHnvNAD7PHWclmoFG78Q2xLK0KKcs= github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg= github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.2 h1:XB4z0hbQtpmBnb1FQYvKaCM7UsS6Y/u8jVBwIUGeCTk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.2/go.mod h1:hwRpqkRxnQ58J9blRDrB4IanlXCpcKmsC83EhG77upg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.20 h1:oIaQ1e17CSKaWmUTu62MtraRWVIosn/iONMuZt0gbqc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.20/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.21 h1:nyLjs8sYJShFYj6aiyjCBI3EcLn1udWrQTjEF+SOXB0= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.21/go.mod h1:EhdxtZ+g84MSGrSrHzZiUm9PYiZkrADNja15wtRJSJo= github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0= github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w= -github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= -github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -194,82 +124,48 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/collector/component v1.33.0 h1:AoP5ZGEU7Q3YDYQx2CgYy82Xmy3gLgh1WCMeLtTXXFo= -go.opentelemetry.io/collector/component v1.33.0/go.mod h1:/5v3hl1GSQT45D6T7sE/LB6nlQMMRHCYDX1glJamh7E= go.opentelemetry.io/collector/component v1.34.0 h1:YONg7FaZ5zZbj5cLdARvwtMNuZHunuyxw2fWe5fcWqc= go.opentelemetry.io/collector/component v1.34.0/go.mod h1:GvolsSVZskXuyfQdwYacqeBSZe/1tg4RJ0YK55KSvDA= -go.opentelemetry.io/collector/component/componenttest v0.127.0 h1:2cieQeh5OS1zf73Aad4b8Rf5vCDk5Hlb6oeJH7Q1VYs= -go.opentelemetry.io/collector/component/componenttest v0.127.0/go.mod h1:0jHbHYRXSNS+nm2vSsxpdAsIj+EDehxKRGk4oclyHKs= go.opentelemetry.io/collector/component/componenttest v0.128.0 h1:MGNh5lQQ0Qmz2SmNwOqLJYaWMDkMLYj/51wjMzTBR34= go.opentelemetry.io/collector/component/componenttest v0.128.0/go.mod h1:hALNxcacqOaX/Gm/dE7sNOxAEFj41SbRqtvF57Yd6gs= -go.opentelemetry.io/collector/consumer v1.33.0 h1:y6ohYtFsXHdD3eJ67SRHSgumRQRNlR6N+DuyjOq3hYo= -go.opentelemetry.io/collector/consumer v1.33.0/go.mod h1:WwB/nHWw6KwumVy7OayUmvRa7V3UsfK+f8qwW8/c5rY= go.opentelemetry.io/collector/consumer v1.34.0 h1:oBhHH6mgViOGhVDPozE+sUdt7jFBo2Hh32lsSr2L3Tc= go.opentelemetry.io/collector/consumer v1.34.0/go.mod h1:DVMCb56ZBlPNcmo0lSJKn3rp18oyZQCedRE4GKIMI+Q= -go.opentelemetry.io/collector/consumer/consumererror v0.127.0 h1:9MylkP5eR2hlaj80v67VRUjSoiHNNHTK37gCrtz/9+w= -go.opentelemetry.io/collector/consumer/consumererror v0.127.0/go.mod h1:7FRcHa5E8rMytzJHRdzd9SzgweDwfvEc92Clq54BjSA= go.opentelemetry.io/collector/consumer/consumererror v0.128.0 h1:3htkWoHwXZ801ORmGeORdcMGqJHEbwdjaWhIj4LNbxw= go.opentelemetry.io/collector/consumer/consumererror v0.128.0/go.mod h1:v3eUnvuIBSV2yBWiWoZELV1jki7HFMttWeBF311XIU0= -go.opentelemetry.io/collector/consumer/consumertest v0.127.0 h1:rtp7ilS1P1xVfmZu0XnWohhi1N2d+wtWo9ORo8A1Xb8= -go.opentelemetry.io/collector/consumer/consumertest v0.127.0/go.mod h1:SFn8ifdrKulaQWDIvQskmEjSNdMZMQ5upQYJXLFEvzg= go.opentelemetry.io/collector/consumer/consumertest v0.128.0 h1:x50GB0I/QvU3sQuNCap5z/P2cnq2yHoRJ/8awkiT87w= go.opentelemetry.io/collector/consumer/consumertest v0.128.0/go.mod h1:Wb3IAbMY/DOIwJPy81PuBiW2GnKoNIz4THE7wfJwovE= -go.opentelemetry.io/collector/consumer/xconsumer v0.127.0 h1:23qpVECDiqad44d9HtQ1M4P4g2xbB4A7R1b9yux2Gag= -go.opentelemetry.io/collector/consumer/xconsumer v0.127.0/go.mod h1:vZ06tk8nu2OyeizjN6AtlaftY79WuODi2rC3U7lxsb4= go.opentelemetry.io/collector/consumer/xconsumer v0.128.0 h1:4E+KTdCjkRS3SIw0bsv5kpv9XFXHf8x9YiPEuxBVEHY= go.opentelemetry.io/collector/consumer/xconsumer v0.128.0/go.mod h1:OmzilL/qbjCzPMHay+WEA7/cPe5xuX7Jbj5WPIpqaMo= -go.opentelemetry.io/collector/featuregate v1.33.0 h1:ronhxafsUE7H3Cem4U2PXrvDZhxA9Gixx4Wik7X32X8= -go.opentelemetry.io/collector/featuregate v1.33.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= go.opentelemetry.io/collector/featuregate v1.34.0 h1:zqDHpEYy1UeudrfUCvlcJL2t13dXywrC6lwpNZ5DrCU= go.opentelemetry.io/collector/featuregate v1.34.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= -go.opentelemetry.io/collector/internal/telemetry v0.127.0 h1:/wAnPmFjUN7MwnRyDYJzUJZa5n0qK9zM1F7PgMWM5Y0= -go.opentelemetry.io/collector/internal/telemetry v0.127.0/go.mod h1:Un7Zn//l0BkE6hk6wirsTGwnJJpxw/gJWgzYL3eSruk= go.opentelemetry.io/collector/internal/telemetry v0.128.0 h1:ySEYWoY7J8DAYdlw2xlF0w+ODQi3AhYj7TRNflsCbx8= go.opentelemetry.io/collector/internal/telemetry v0.128.0/go.mod h1:572B/iJqjauv3aT+zcwnlNWBPqM7+KqrYGSUuOAStrM= -go.opentelemetry.io/collector/pdata v1.33.1-0.20250602202233-e45c0e524c62 h1:alIC+vWBd7I4NbvD6UwlUyZk1Q+3xhI5QfmKsiSe8Zo= -go.opentelemetry.io/collector/pdata v1.33.1-0.20250602202233-e45c0e524c62/go.mod h1:StPHMFkhLBellRWrULq0DNjv4znCDJZP6La4UuC+JHI= go.opentelemetry.io/collector/pdata v1.34.0 h1:2vwYftckXe7pWxI9mfSo+tw3wqdGNrYpMbDx/5q6rw8= go.opentelemetry.io/collector/pdata v1.34.0/go.mod h1:StPHMFkhLBellRWrULq0DNjv4znCDJZP6La4UuC+JHI= -go.opentelemetry.io/collector/pdata/pprofile v0.127.1-0.20250602202233-e45c0e524c62 h1:vSu1HFq8mBSUx73Hpm3ef33y4yXe/nzfQSv2g7eoJwU= -go.opentelemetry.io/collector/pdata/pprofile v0.127.1-0.20250602202233-e45c0e524c62/go.mod h1:4ksErLxkSGOzgy+q7u0eVDSbxN0XBMi2U/ahbvPevWA= go.opentelemetry.io/collector/pdata/pprofile v0.128.0 h1:6DEtzs/liqv/ukz2EHbC5OMaj2V6K2pzuj/LaRg2YmY= go.opentelemetry.io/collector/pdata/pprofile v0.128.0/go.mod h1:bVVRpz+zKFf1UCCRUFqy8LvnO3tHlXKkdqW2d+Wi/iA= -go.opentelemetry.io/collector/pdata/testdata v0.127.0 h1:1j6KWO/7TyyUaYpIeyxWzsE/klVYGFhbsTCJp4GaTco= -go.opentelemetry.io/collector/pdata/testdata v0.127.0/go.mod h1:UXvOckTD4hhAA9nzRQik0lVBU/hJ+SFes+ar9LjzYBk= -go.opentelemetry.io/collector/pipeline v0.127.0 h1:WdllRrWwsJ1yAr9l4LRiArb0ekdNaGuMJP8zQ6lZlos= -go.opentelemetry.io/collector/pipeline v0.127.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/pdata/testdata v0.128.0 h1:5xcsMtyzvb18AnS2skVtWreQP1nl6G3PiXaylKCZ6pA= +go.opentelemetry.io/collector/pdata/testdata v0.128.0/go.mod h1:9/VYVgzv3JMuIyo19KsT3FwkVyxbh3Eg5QlabQEUczA= go.opentelemetry.io/collector/pipeline v0.128.0 h1:WgNXdFbyf/QRLy5XbO/jtPQosWrSWX/TEnSYpJq8bgI= go.opentelemetry.io/collector/pipeline v0.128.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= -go.opentelemetry.io/collector/receiver v1.33.0 h1:ge3LSQZ5uSZQUQhGb9hg1iWIUg6NQwOs+Wv29DyRZmk= -go.opentelemetry.io/collector/receiver v1.33.0/go.mod h1:RkTKFqh9+lSY3QayvfJ39dv7bAMRIHHnx1dd8TvmVMU= go.opentelemetry.io/collector/receiver v1.34.0 h1:un6iRBXZBz1zacEmyfDCVDDaBY4GP3TQLwor894fywg= go.opentelemetry.io/collector/receiver v1.34.0/go.mod h1:4J9xhbXJiI/rYlvlMTskXRGbwFeczJiCkW5R2YfTe88= -go.opentelemetry.io/collector/receiver/receivertest v0.127.0 h1:3XtARAYqYxhcOa9LMmr9tc03sKZZFjsTjUgcJlPxZI0= -go.opentelemetry.io/collector/receiver/receivertest v0.127.0/go.mod h1:OSMA/bmiB+a73JboiCuvVPrPR7+1CuMh1PTNRTWDTEQ= go.opentelemetry.io/collector/receiver/receivertest v0.128.0 h1:lIWzLAeo7EssZ9d1t6CJvCN2imoM4Fj+9HSbEZ54fBw= go.opentelemetry.io/collector/receiver/receivertest v0.128.0/go.mod h1:1aX38R6cYe2nfw5rYW6dbHwjtUjs8z2MxrfHbXBddx8= -go.opentelemetry.io/collector/receiver/xreceiver v0.127.0 h1:oUAz3sCcOl+Mt/e5Gq3nZX0J0bpFUghLkItnC0bqWy0= -go.opentelemetry.io/collector/receiver/xreceiver v0.127.0/go.mod h1:spfky570JgiS7CRDbM/DiWJSM/mkq5RmdwldbFOMVoM= go.opentelemetry.io/collector/receiver/xreceiver v0.128.0 h1:1C5vlkyacvuGJkn5J78FpnuF3AlVYMmA0TGF3LPfcZI= go.opentelemetry.io/collector/receiver/xreceiver v0.128.0/go.mod h1:kut2p3qChyX8K/qhsokae1vgLQAn53i2J5ddsvxJ81s= -go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= -go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= go.opentelemetry.io/contrib/bridges/otelzap v0.11.0 h1:u2E32P7j1a/gRgZDWhIXC+Shd4rLg70mnE7QLI/Ssnw= go.opentelemetry.io/contrib/bridges/otelzap v0.11.0/go.mod h1:pJPCLM8gzX4ASqLlyAXjHBEYxgbOQJ/9bidWxD6PEPQ= go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= -go.opentelemetry.io/otel/log v0.11.0 h1:c24Hrlk5WJ8JWcwbQxdBqxZdOK7PcP/LFtOtwpDTe3Y= -go.opentelemetry.io/otel/log v0.11.0/go.mod h1:U/sxQ83FPmT29trrifhQg+Zj2lo1/IPN1PF6RTFqdwc= go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc= go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= +go.opentelemetry.io/otel/log/logtest v0.0.0-20250526142609-aa5bd0e64989 h1:4JF7oY9CcHrPGfBLijDcXZyCzGckVEyOjuat5ktmQRg= +go.opentelemetry.io/otel/log/logtest v0.0.0-20250526142609-aa5bd0e64989/go.mod h1:NToOxLDCS1tXDSB2dIj44H9xGPOpKr0csIN+gnuihv4= go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= -go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= -go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= -go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= -go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= @@ -280,15 +176,11 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -golang.org/x/arch v0.17.0 h1:4O3dfLzd+lQewptAHqjewQZQDyEdejz3VwgeYwkZneU= -golang.org/x/arch v0.17.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/arch v0.18.0 h1:WN9poc33zL4AzGxqf8VtpKUnGvMi8O9lhNyBMF/85qc= golang.org/x/arch v0.18.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b h1:QoALfVG9rhQ/M7vYDScfPdWjGL9dlsVVM5VGh7aKoAA= -golang.org/x/exp v0.0.0-20250531010427-b6e5de432a8b/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -306,8 +198,6 @@ golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -334,12 +224,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g= google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= -google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= diff --git a/internal/helpers/address.go b/internal/helpers/address.go deleted file mode 100644 index b46a89a89..000000000 --- a/internal/helpers/address.go +++ /dev/null @@ -1,138 +0,0 @@ -package helpers // import "go.opentelemetry.io/ebpf-profiler/internal/helpers" - -import ( - "errors" - "fmt" - "net" - "os" - - "github.com/jsimonetti/rtnetlink/v2" - log "github.com/sirupsen/logrus" - "golang.org/x/sys/unix" -) - -func addressFamily(ip net.IP) (uint8, error) { - if ip.To4() != nil { - return unix.AF_INET, nil - } - if len(ip) == net.IPv6len { - return unix.AF_INET6, nil - } - return 0, fmt.Errorf("invalid IP address: %v", ip) -} - -func resolveDestination(domain string) ([]net.IP, error) { - dstIPs, err := net.LookupIP(domain) - if err == nil { - return dstIPs, nil - } - - // domain seems not to be a DNS value. - // Try to interpret it as IP. - host, _, err := net.SplitHostPort(domain) - if err != nil { - return []net.IP{}, err - } - return net.LookupIP(host) -} - -// getSourceIPAddress returns the source IP address for the traffic destined to the specified -// domain. -func getSourceIPAddress(domain string) (net.IP, error) { - conn, err := rtnetlink.Dial(nil) - if err != nil { - return nil, errors.New("unable to open netlink connection") - } - defer conn.Close() - - dstIPs, err := resolveDestination(domain) - if err != nil { - return nil, fmt.Errorf("unable to resolve %s: %v", domain, err) - } - if len(dstIPs) == 0 { - return nil, fmt.Errorf("unable to resolve %s: no IP address", domain) - } - - var srcIP net.IP - var lastError error - found := false - - // We might get multiple IP addresses, check all of them as some may not be routable (like an - // IPv6 address on an IPv4 network). - for _, ip := range dstIPs { - addressFamily, err := addressFamily(ip) - if err != nil { - return nil, fmt.Errorf("unable to get address family for %s: %v", ip.String(), err) - } - - req := &rtnetlink.RouteMessage{ - Family: addressFamily, - Table: unix.RT_TABLE_MAIN, - Attributes: rtnetlink.RouteAttributes{ - Dst: ip, - }, - } - - routes, err := conn.Route.Get(req) - if err != nil { - lastError = fmt.Errorf("unable to get route to %s (%s): %v", domain, ip.String(), err) - continue - } - - if len(routes) == 0 { - continue - } - if len(routes) > 1 { - // More than 1 route! - // This doesn't look like this should ever happen (even in the presence of overlapping - // routes with same metric, this will return a single route). - // May be a leaky abstraction/artifact from the way the netlink API works? - // Regardless, this seems ok to ignore, but log just in case. - log.Warnf("Found multiple (%d) routes to %v; first 2 routes: %#v and %#v", - len(routes), domain, routes[0], routes[1]) - } - - // Sanity-check the result, in case the source address is left uninitialized - if len(routes[0].Attributes.Src) == 0 { - lastError = fmt.Errorf( - "unable to get route to %s (%s): no source IP address", domain, ip.String()) - continue - } - - srcIP = routes[0].Attributes.Src - found = true - break - } - - if !found { - return nil, fmt.Errorf("no route found to %s: %v", domain, lastError) - } - - log.Debugf("Traffic to %v is routed from %v", domain, srcIP.String()) - return srcIP, nil -} - -// GetHostnameAndSourceIP returns the hostname and source IP address for the traffic destined to -// the specified domain. -func GetHostnameAndSourceIP(domain string) (hostname, sourceIP string, err error) { - err = runInRootNS(func() error { - var joinedErr error - - if name, hostnameErr := os.Hostname(); hostnameErr == nil { - hostname = name - } else { - joinedErr = fmt.Errorf("failed to get hostname: %v", hostnameErr) - } - - if srcIP, ipErr := getSourceIPAddress(domain); ipErr == nil { - sourceIP = srcIP.String() - } else { - joinedErr = errors.Join(joinedErr, - fmt.Errorf("failed to get source IP: %v", ipErr)) - } - - return joinedErr - }) - - return hostname, sourceIP, err -} diff --git a/internal/helpers/kernel.go b/internal/helpers/kernel.go deleted file mode 100644 index 19b4c548b..000000000 --- a/internal/helpers/kernel.go +++ /dev/null @@ -1,16 +0,0 @@ -package helpers // import "go.opentelemetry.io/ebpf-profiler/internal/helpers" - -import ( - "fmt" - - "go.opentelemetry.io/ebpf-profiler/tracer" -) - -// GetKernelVersion returns the current version of the kernel -func GetKernelVersion() (string, error) { - major, minor, patch, err := tracer.GetCurrentKernelVersion() - if err != nil { - return "", err - } - return fmt.Sprintf("%d.%d.%d", major, minor, patch), nil -} diff --git a/internal/helpers/namespaces.go b/internal/helpers/namespaces.go deleted file mode 100644 index b72ede198..000000000 --- a/internal/helpers/namespaces.go +++ /dev/null @@ -1,120 +0,0 @@ -package helpers // import "go.opentelemetry.io/ebpf-profiler/internal/helpers" - -import ( - "errors" - "fmt" - "runtime" - "sync" - "syscall" - - log "github.com/sirupsen/logrus" - "golang.org/x/sys/unix" -) - -// runInRootNS executes fetcher in the root namespace. -func runInRootNS(fetcher func() error) error { - // We need to call the `setns` syscall to extract information (network route, hostname) from - // different namespaces. - // However, `setns` doesn't know about goroutines, it operates on OS threads. - // Therefore, the below code needs to take extra steps to make sure no other code (outside of - // this function) will execute in a different namespace. - // - // To do this, we use `runtime.LockOSThread()`, which we call from a separate goroutine. - // runtime.LockOSThread() ensures that the thread executing the goroutine will be terminated - // when the goroutine exits, which makes it impossible for the entered namespaces to be used in - // a different context than the below code. - // - // It would be doable without a goroutine, by saving and restoring the namespaces before calling - // runtime.UnlockOSThread(), but error handling makes things complicated and unsafe/dangerous. - // The below implementation is always safe to run even in the presence of errors. - // - // The only downside is that calling this function comes at the cost of sacrificing an OS - // thread, which will likely force the Go runtime to launch a new thread later. This should be - // acceptable if it doesn't happen too often. - - // Error result of the below goroutine. May contain multiple combined errors. - var errResult error - - var wg sync.WaitGroup - wg.Add(1) - go func() { - defer wg.Done() - // Before entering a different namespace, lock the current goroutine to a thread. - // Note that we do *not* call runtime.UnlockOSThread(): this ensures the current thread - // will exit after the goroutine finishes, which makes it impossible for other - // goroutines to enter a different namespace. - runtime.LockOSThread() - - // Try to enter root namespaces. If that fails, continue anyway as we might be able to - // gather some metadata. - utsFD, netFD := tryEnterRootNamespaces() - - // Any errors were already logged by the above function. - if utsFD != -1 { - defer unix.Close(utsFD) - } - if netFD != -1 { - defer unix.Close(netFD) - } - - if utsFD == -1 || netFD == -1 { - log.Warnf("Missing capabilities to enter root namespace, fetching information from " + - "current process namespaces") - } - - errResult = fetcher() - }() - - wg.Wait() - - return errResult -} - -// tryEnterRootNamespaces tries to enter PID 1's UTS and network namespaces. -// It returns the file descriptor associated to each, or -1 if the namespace cannot be entered. -func tryEnterRootNamespaces() (utsFD, netFD int) { - netFD, err := enterNamespace(1, "net") - if err != nil { - log.Errorf( - "Unable to enter root network namespace, host metadata may be incorrect: %v", err) - netFD = -1 - } - - utsFD, err = enterNamespace(1, "uts") - if err != nil { - log.Errorf("Unable to enter root UTS namespace, host metadata may be incorrect: %v", err) - utsFD = -1 - } - - return utsFD, netFD -} - -// enterNamespace enters a new namespace of the specified type, inherited from the provided PID. -// The returned file descriptor must be closed with unix.Close(). -// Note that this function affects the OS thread calling this function, which will likely impact -// more than one goroutine unless you also use runtime.LockOSThread. -func enterNamespace(pid int, nsType string) (int, error) { - var nsTypeInt int - switch nsType { - case "net": - nsTypeInt = syscall.CLONE_NEWNET - case "uts": - nsTypeInt = syscall.CLONE_NEWUTS - default: - return -1, fmt.Errorf("unsupported namespace type: %s", nsType) - } - - path := fmt.Sprintf("/proc/%d/ns/%s", pid, nsType) - fd, err := unix.Open(path, unix.O_RDONLY|unix.O_CLOEXEC, 0) - if err != nil { - return -1, err - } - - err = unix.Setns(fd, nsTypeInt) - if err != nil { - // Close namespace and return the error - return -1, errors.Join(err, unix.Close(fd)) - } - - return fd, nil -} diff --git a/main.go b/main.go index 97302c8f7..607096084 100644 --- a/main.go +++ b/main.go @@ -16,7 +16,6 @@ import ( "golang.org/x/sys/unix" "go.opentelemetry.io/ebpf-profiler/internal/controller" - "go.opentelemetry.io/ebpf-profiler/internal/helpers" "go.opentelemetry.io/ebpf-profiler/reporter" "go.opentelemetry.io/ebpf-profiler/times" "go.opentelemetry.io/ebpf-profiler/vc" @@ -102,20 +101,9 @@ func mainWithExitCode() exitCode { intervals := times.New(cfg.ReporterInterval, cfg.MonitorInterval, cfg.ProbabilisticInterval) - kernelVersion, err := helpers.GetKernelVersion() - if err != nil { - log.Error(err) - return exitFailure - } - - // hostname and sourceIP will be populated from the root namespace. - hostname, sourceIP, err := helpers.GetHostnameAndSourceIP(cfg.CollAgentAddr) - if err != nil { - log.Error(err) - return exitFailure - } - rep, err := reporter.NewOTLP(&reporter.Config{ + Name: os.Args[0], + Version: vc.Version(), CollAgentAddr: cfg.CollAgentAddr, DisableTLS: cfg.DisableTLS, MaxRPCMsgSize: 32 << 20, // 32 MiB @@ -129,9 +117,6 @@ func mainWithExitCode() exitCode { FramesCacheElements: 131072, CGroupCacheElements: 1024, SamplesPerSecond: cfg.SamplesPerSecond, - KernelVersion: kernelVersion, - HostName: hostname, - IPAddress: sourceIP, }) if err != nil { log.Error(err) diff --git a/reporter/base_reporter.go b/reporter/base_reporter.go index 8e11197d6..364133ed1 100644 --- a/reporter/base_reporter.go +++ b/reporter/base_reporter.go @@ -38,7 +38,7 @@ type baseReporter struct { cgroupv2ID *lru.SyncedLRU[libpf.PID, string] // traceEvents stores reported trace events (trace metadata with frames and counts) - traceEvents xsync.RWMutex[map[libpf.Origin]samples.KeyToEventMapping] + traceEvents xsync.RWMutex[samples.TraceEventsTree] // hostmetadata stores metadata that is sent out with every request. hostmetadata *lru.SyncedLRU[string, string] @@ -114,17 +114,26 @@ func (b *baseReporter) ReportTraceEvent(trace *libpf.Trace, meta *samples.TraceE ExtraMeta: extraMeta, } - traceEventsMap := b.traceEvents.WLock() - defer b.traceEvents.WUnlock(&traceEventsMap) + eventsTree := b.traceEvents.WLock() + defer b.traceEvents.WUnlock(&eventsTree) - if events, exists := (*traceEventsMap)[meta.Origin][key]; exists { + if _, exists := (*eventsTree)[samples.ContainerID(containerID)]; !exists { + (*eventsTree)[samples.ContainerID(containerID)] = + make(map[libpf.Origin]samples.KeyToEventMapping) + } + + if _, exists := (*eventsTree)[samples.ContainerID(containerID)][meta.Origin]; !exists { + (*eventsTree)[samples.ContainerID(containerID)][meta.Origin] = + make(samples.KeyToEventMapping) + } + + if events, exists := (*eventsTree)[samples.ContainerID(containerID)][meta.Origin][key]; exists { events.Timestamps = append(events.Timestamps, uint64(meta.Timestamp)) events.OffTimes = append(events.OffTimes, meta.OffTime) - (*traceEventsMap)[meta.Origin][key] = events + (*eventsTree)[samples.ContainerID(containerID)][meta.Origin][key] = events return nil } - - (*traceEventsMap)[meta.Origin][key] = &samples.TraceEvents{ + (*eventsTree)[samples.ContainerID(containerID)][meta.Origin][key] = &samples.TraceEvents{ Files: trace.Files, Linenos: trace.Linenos, FrameTypes: trace.FrameTypes, diff --git a/reporter/collector_reporter.go b/reporter/collector_reporter.go index e986c60ce..4ae5bc349 100644 --- a/reporter/collector_reporter.go +++ b/reporter/collector_reporter.go @@ -5,7 +5,6 @@ package reporter // import "go.opentelemetry.io/ebpf-profiler/reporter" import ( "context" - "maps" "time" lru "github.com/elastic/go-freelru" @@ -16,7 +15,6 @@ import ( "go.opentelemetry.io/ebpf-profiler/libpf/xsync" "go.opentelemetry.io/ebpf-profiler/reporter/internal/pdata" "go.opentelemetry.io/ebpf-profiler/reporter/samples" - "go.opentelemetry.io/ebpf-profiler/support" ) // Assert that we implement the full Reporter interface. @@ -57,11 +55,7 @@ func NewCollector(cfg *Config, nextConsumer xconsumer.Profiles) (*CollectorRepor return nil, err } - originsMap := make(map[libpf.Origin]samples.KeyToEventMapping, 2) - for _, origin := range []libpf.Origin{support.TraceOriginSampling, - support.TraceOriginOffCPU} { - originsMap[origin] = make(samples.KeyToEventMapping) - } + tree := make(samples.TraceEventsTree) return &CollectorReporter{ baseReporter: &baseReporter{ @@ -70,7 +64,7 @@ func NewCollector(cfg *Config, nextConsumer xconsumer.Profiles) (*CollectorRepor version: cfg.Version, pdata: data, cgroupv2ID: cgroupv2ID, - traceEvents: xsync.NewRWMutex(originsMap), + traceEvents: xsync.NewRWMutex(tree), hostmetadata: hostmetadata, runLoop: &runLoop{ stopSignal: make(chan libpf.Void), @@ -107,16 +101,13 @@ func (r *CollectorReporter) Start(ctx context.Context) error { // reportProfile creates and sends out a profile. func (r *CollectorReporter) reportProfile(ctx context.Context) error { - traceEvents := r.traceEvents.WLock() - events := make(map[libpf.Origin]samples.KeyToEventMapping, 2) - for _, origin := range []libpf.Origin{support.TraceOriginSampling, - support.TraceOriginOffCPU} { - events[origin] = maps.Clone((*traceEvents)[origin]) - clear((*traceEvents)[origin]) - } - r.traceEvents.WUnlock(&traceEvents) + traceEventsPtr := r.traceEvents.WLock() + reportedEvents := (*traceEventsPtr) + newEvents := make(samples.TraceEventsTree) + *traceEventsPtr = newEvents + r.traceEvents.WUnlock(&traceEventsPtr) - profiles := r.pdata.Generate(events) + profiles := r.pdata.Generate(reportedEvents, r.name, r.version) if profiles.SampleCount() == 0 { log.Debugf("Skip sending profile with no samples") return nil diff --git a/reporter/config.go b/reporter/config.go index 09c2665ea..0c13f47cf 100644 --- a/reporter/config.go +++ b/reporter/config.go @@ -34,14 +34,6 @@ type Config struct { CGroupCacheElements uint32 // samplesPerSecond defines the number of samples per second. SamplesPerSecond int - // HostID is the host ID to be sent to the collection agent. - HostID uint64 - // KernelVersion is the kernel version of the host. - KernelVersion string - // HostName is the name of the host. - HostName string - // IPAddress is the IP address of the host. - IPAddress string // Number of connection attempts to the collector after which we give up retrying. MaxGRPCRetries uint32 diff --git a/reporter/internal/pdata/generate.go b/reporter/internal/pdata/generate.go index 642754014..254e803fb 100644 --- a/reporter/internal/pdata/generate.go +++ b/reporter/internal/pdata/generate.go @@ -4,7 +4,6 @@ package pdata // import "go.opentelemetry.io/ebpf-profiler/reporter/internal/pdata" import ( - "crypto/rand" "path/filepath" "slices" "time" @@ -29,34 +28,38 @@ const ( // Generate generates a pdata request out of internal profiles data, to be // exported. -func (p *Pdata) Generate(events map[libpf.Origin]samples.KeyToEventMapping) pprofile.Profiles { +func (p *Pdata) Generate(tree samples.TraceEventsTree, + agentName, agentVersion string) pprofile.Profiles { profiles := pprofile.NewProfiles() - rp := profiles.ResourceProfiles().AppendEmpty() - sp := rp.ScopeProfiles().AppendEmpty() - for _, origin := range []libpf.Origin{ - support.TraceOriginSampling, - support.TraceOriginOffCPU, - } { - if len(events[origin]) == 0 { - // Do not append empty profiles, if there - // is not profiling data for this origin. + + for containerID, originToEvents := range tree { + if len(originToEvents) == 0 { continue } - prof := sp.Profiles().AppendEmpty() - prof.SetProfileID(pprofile.ProfileID(mkProfileID())) - p.setProfile(profiles.ProfilesDictionary(), origin, events[origin], prof) - } - return profiles -} -// mkProfileID creates a random profile ID. -func mkProfileID() []byte { - profileID := make([]byte, 16) - _, err := rand.Read(profileID) - if err != nil { - return []byte("opentelemetry-ebpf-profiler") + rp := profiles.ResourceProfiles().AppendEmpty() + rp.Resource().Attributes().PutStr(string(semconv.ContainerIDKey), string(containerID)) + + sp := rp.ScopeProfiles().AppendEmpty() + sp.Scope().SetName(agentName) + sp.Scope().SetVersion(agentVersion) + + for _, origin := range []libpf.Origin{ + support.TraceOriginSampling, + support.TraceOriginOffCPU, + } { + if len(originToEvents[origin]) == 0 { + // Do not append empty profiles, if there + // is not profiling data for this origin. + continue + } + + prof := sp.Profiles().AppendEmpty() + + p.setProfile(profiles.ProfilesDictionary(), origin, originToEvents[origin], prof) + } } - return profileID + return profiles } // setProfile sets the data an OTLP profile with all collected samples up to diff --git a/reporter/internal/pdata/generate_test.go b/reporter/internal/pdata/generate_test.go index ef5c92eff..fc96b6ad5 100644 --- a/reporter/internal/pdata/generate_test.go +++ b/reporter/internal/pdata/generate_test.go @@ -162,6 +162,7 @@ func TestGetDummyMappingIndex(t *testing.T) { } } +//nolint:lll func TestFunctionTableOrder(t *testing.T) { for _, tt := range []struct { name string @@ -169,16 +170,19 @@ func TestFunctionTableOrder(t *testing.T) { frames map[libpf.FileID]map[libpf.AddressOrLineno]samples.SourceInfo events map[libpf.Origin]samples.KeyToEventMapping - wantFunctionTable []string + wantFunctionTable []string + expectedResourceProfiles int }{ { - name: "with no executables", - executables: map[libpf.FileID]samples.ExecInfo{}, - frames: map[libpf.FileID]map[libpf.AddressOrLineno]samples.SourceInfo{}, - events: map[libpf.Origin]samples.KeyToEventMapping{}, - wantFunctionTable: []string{""}, + name: "no events", + executables: map[libpf.FileID]samples.ExecInfo{}, + frames: map[libpf.FileID]map[libpf.AddressOrLineno]samples.SourceInfo{}, + events: map[libpf.Origin]samples.KeyToEventMapping{}, + wantFunctionTable: []string{""}, + expectedResourceProfiles: 0, }, { - name: "single executable", + name: "single executable", + expectedResourceProfiles: 1, executables: map[libpf.FileID]samples.ExecInfo{ libpf.NewFileID(2, 3): {}, }, @@ -256,10 +260,17 @@ func TestFunctionTableOrder(t *testing.T) { for k, v := range tt.executables { d.Executables.Add(k, v) } - res := d.Generate(tt.events) - expectedProfiles := len(tt.events) - require.Equal(t, 1, res.ResourceProfiles().Len()) + tree := make(samples.TraceEventsTree) + tree[""] = tt.events + res := d.Generate(tree, tt.name, "version") + require.Equal(t, tt.expectedResourceProfiles, res.ResourceProfiles().Len()) + if tt.expectedResourceProfiles == 0 { + // Do not check elements of ResourceProfile if there is no expected + // ResourceProfile. + return + } require.Equal(t, 1, res.ResourceProfiles().At(0).ScopeProfiles().Len()) + expectedProfiles := len(tt.events) require.Equal(t, expectedProfiles, res.ResourceProfiles(). At(0).ScopeProfiles(). At(0).Profiles().Len()) diff --git a/reporter/otlp_reporter.go b/reporter/otlp_reporter.go index a0d005573..2191c6583 100644 --- a/reporter/otlp_reporter.go +++ b/reporter/otlp_reporter.go @@ -6,15 +6,11 @@ package reporter // import "go.opentelemetry.io/ebpf-profiler/reporter" import ( "context" "crypto/tls" - "maps" - "strconv" "time" lru "github.com/elastic/go-freelru" log "github.com/sirupsen/logrus" - "go.opentelemetry.io/collector/pdata/pprofile" "go.opentelemetry.io/collector/pdata/pprofile/pprofileotlp" - semconv "go.opentelemetry.io/otel/semconv/v1.30.0" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -23,7 +19,6 @@ import ( "go.opentelemetry.io/ebpf-profiler/libpf/xsync" "go.opentelemetry.io/ebpf-profiler/reporter/internal/pdata" "go.opentelemetry.io/ebpf-profiler/reporter/samples" - "go.opentelemetry.io/ebpf-profiler/support" ) // Assert that we implement the full Reporter interface. @@ -33,18 +28,6 @@ var _ Reporter = (*OTLPReporter)(nil) type OTLPReporter struct { *baseReporter - // hostID is the unique identifier of the host. - hostID string - - // kernelVersion is the version of the kernel. - kernelVersion string - - // hostName is the name of the host. - hostName string - - // ipAddress is the IP address of the host. - ipAddress string - // client for the connection to the receiver. client pprofileotlp.GRPCClient @@ -84,11 +67,7 @@ func NewOTLP(cfg *Config) (*OTLPReporter, error) { return nil, err } - originsMap := make(map[libpf.Origin]samples.KeyToEventMapping, 2) - for _, origin := range []libpf.Origin{support.TraceOriginSampling, - support.TraceOriginOffCPU} { - originsMap[origin] = make(samples.KeyToEventMapping) - } + eventsTree := make(samples.TraceEventsTree) return &OTLPReporter{ baseReporter: &baseReporter{ @@ -97,16 +76,12 @@ func NewOTLP(cfg *Config) (*OTLPReporter, error) { version: cfg.Version, pdata: data, cgroupv2ID: cgroupv2ID, - traceEvents: xsync.NewRWMutex(originsMap), + traceEvents: xsync.NewRWMutex(eventsTree), hostmetadata: hostmetadata, runLoop: &runLoop{ stopSignal: make(chan libpf.Void), }, }, - kernelVersion: cfg.KernelVersion, - hostName: cfg.HostName, - ipAddress: cfg.IPAddress, - hostID: strconv.FormatUint(cfg.HostID, 10), pkgGRPCOperationTimeout: cfg.GRPCOperationTimeout, client: nil, }, nil @@ -154,20 +129,13 @@ func (r *OTLPReporter) Start(ctx context.Context) error { // reportOTLPProfile creates and sends out an OTLP profile. func (r *OTLPReporter) reportOTLPProfile(ctx context.Context) error { - traceEvents := r.traceEvents.WLock() - events := make(map[libpf.Origin]samples.KeyToEventMapping, 2) - for _, origin := range []libpf.Origin{support.TraceOriginSampling, - support.TraceOriginOffCPU} { - events[origin] = maps.Clone((*traceEvents)[origin]) - clear((*traceEvents)[origin]) - } - r.traceEvents.WUnlock(&traceEvents) - - profiles := r.pdata.Generate(events) - for i := 0; i < profiles.ResourceProfiles().Len(); i++ { - r.setResource(profiles.ResourceProfiles().At(i)) - } + traceEventsPtr := r.traceEvents.WLock() + reportedEvents := (*traceEventsPtr) + newEvents := make(samples.TraceEventsTree) + *traceEventsPtr = newEvents + r.traceEvents.WUnlock(&traceEventsPtr) + profiles := r.pdata.Generate(reportedEvents, r.name, r.version) if profiles.SampleCount() == 0 { log.Debugf("Skip sending of OTLP profile with no samples") return nil @@ -180,29 +148,6 @@ func (r *OTLPReporter) reportOTLPProfile(ctx context.Context) error { return err } -// setResource sets the resource information of the origin of the profiles. -// Next step: maybe extend this information with go.opentelemetry.io/otel/sdk/resource. -func (r *OTLPReporter) setResource(rp pprofile.ResourceProfiles) { - keys := r.hostmetadata.Keys() - attrs := rp.Resource().Attributes() - - // Add hostmedata to the attributes. - for _, k := range keys { - if v, ok := r.hostmetadata.Get(k); ok { - attrs.PutStr(k, v) - } - } - - // Add event specific attributes. - // These attributes are also included in the host metadata, but with different names/keys. - // That makes our hostmetadata attributes incompatible with OTEL collectors. - attrs.PutStr(string(semconv.HostIDKey), r.hostID) - attrs.PutStr(string(semconv.HostIPKey), r.ipAddress) - attrs.PutStr(string(semconv.HostNameKey), r.hostName) - attrs.PutStr(string(semconv.ServiceVersionKey), r.version) - attrs.PutStr("os.kernel", r.kernelVersion) -} - // waitGrpcEndpoint waits until the gRPC connection is established. func waitGrpcEndpoint(ctx context.Context, cfg *Config) (*grpc.ClientConn, error) { // Sleep with a fixed backoff time added of +/- 20% jitter diff --git a/reporter/samples/samples.go b/reporter/samples/samples.go index 70318b92b..319b97d7c 100644 --- a/reporter/samples/samples.go +++ b/reporter/samples/samples.go @@ -53,6 +53,13 @@ type TraceAndMetaKey struct { ExtraMeta any } +// TraceEventsTree stores samples and their related metadata in a tree-like +// structure optimized for the OTel Profiling protocol representation. +type TraceEventsTree map[ContainerID]map[libpf.Origin]KeyToEventMapping + +// ContainerID represents an extracted key from /proc//cgroup. +type ContainerID string + // KeyToEventMapping supports temporary mapping traces to additional information. type KeyToEventMapping map[TraceAndMetaKey]*TraceEvents