otel.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package logs
  2. import (
  3. "context"
  4. "os"
  5. "time"
  6. otel "github.com/agoda-com/opentelemetry-logs-go"
  7. "github.com/agoda-com/opentelemetry-logs-go/exporters/otlp/otlplogs"
  8. "github.com/agoda-com/opentelemetry-logs-go/exporters/otlp/otlplogs/otlplogshttp"
  9. otelLogs "github.com/agoda-com/opentelemetry-logs-go/logs"
  10. sdk "github.com/agoda-com/opentelemetry-logs-go/sdk/logs"
  11. "github.com/coroot/coroot-node-agent/common"
  12. "github.com/coroot/logparser"
  13. "go.opentelemetry.io/otel/attribute"
  14. "go.opentelemetry.io/otel/sdk/resource"
  15. semconv "go.opentelemetry.io/otel/semconv/v1.18.0"
  16. "k8s.io/klog/v2"
  17. )
  18. var otelLogger otelLogs.Logger
  19. func Init(machineId, hostname, version string) {
  20. endpoint := os.Getenv("OTEL_EXPORTER_OTLP_LOGS_ENDPOINT")
  21. if endpoint == "" {
  22. klog.Infoln("no OpenTelemetry logs collector endpoint configured")
  23. return
  24. }
  25. klog.Infoln("OpenTelemetry logs collector endpoint:", endpoint)
  26. exporter, _ := otlplogs.NewExporter(context.Background(), otlplogs.WithClient(otlplogshttp.NewClient()))
  27. loggerProvider := sdk.NewLoggerProvider(
  28. sdk.WithBatcher(exporter),
  29. sdk.WithResource(
  30. resource.NewWithAttributes(
  31. semconv.SchemaURL,
  32. semconv.ServiceName("coroot-node-agent"),
  33. semconv.HostName(hostname),
  34. semconv.HostID(machineId),
  35. ),
  36. ),
  37. )
  38. otel.SetLoggerProvider(loggerProvider)
  39. otelLogger = loggerProvider.Logger("coroot-node-agent", otelLogs.WithInstrumentationVersion(version))
  40. }
  41. func OtelLogEmitter(containerId string) logparser.OnMsgCallbackF {
  42. if otelLogger == nil {
  43. return nil
  44. }
  45. return func(ts time.Time, level logparser.Level, patternHash string, msg string) {
  46. severityText := level.String()
  47. severityNumber := otelLogs.UNSPECIFIED
  48. switch level {
  49. case logparser.LevelCritical:
  50. severityNumber = otelLogs.FATAL
  51. case logparser.LevelError:
  52. severityNumber = otelLogs.ERROR
  53. case logparser.LevelWarning:
  54. severityNumber = otelLogs.WARN
  55. case logparser.LevelInfo:
  56. severityNumber = otelLogs.INFO
  57. case logparser.LevelDebug:
  58. severityNumber = otelLogs.DEBUG
  59. }
  60. otelLogger.Emit(
  61. otelLogs.NewLogRecord(otelLogs.LogRecordConfig{
  62. ObservedTimestamp: ts,
  63. SeverityText: &severityText,
  64. SeverityNumber: &severityNumber,
  65. Body: &msg,
  66. Resource: resource.NewSchemaless(
  67. semconv.ServiceName(common.ContainerIdToOtelServiceName(containerId)),
  68. semconv.ContainerID(containerId),
  69. ),
  70. Attributes: &[]attribute.KeyValue{
  71. attribute.Key("pattern.hash").String(patternHash),
  72. },
  73. }),
  74. )
  75. }
  76. }