add signoz
This commit is contained in:
parent
c6f8ab690f
commit
4cbabe4282
|
@ -0,0 +1,25 @@
|
|||
package logger
|
||||
|
||||
const (
|
||||
CtxKeyRequestID = "request_id"
|
||||
)
|
||||
|
||||
const (
|
||||
SeverityTraceLevel = 6
|
||||
SeverityDebugLevel = 5
|
||||
SeverityInfoLevel = 4
|
||||
SeverityWarnLevel = 3
|
||||
SeverityErrorLevel = 2
|
||||
SeverityFatalLevel = 1
|
||||
)
|
||||
|
||||
var (
|
||||
MapStringSeverityLevel = map[int]string{
|
||||
SeverityFatalLevel: "FATAL", // Any error that is forcing a shutdown of the service or application to prevent data loss (or further data loss). I reserve these only for the most heinous errors and situations where there is guaranteed to have been data corruption or loss
|
||||
SeverityErrorLevel: "ERROR", // Any error which is fatal to the operation, but not the service or application (can't open a required file, missing data, etc.). These errors will force user (administrator, or direct user) intervention. These are usually reserved (in my apps) for incorrect connection strings, missing services, etc.
|
||||
SeverityWarnLevel: "WARN", // Anything that can potentially cause application oddities, but for which I am automatically recovering. (Such as switching from a primary to backup server, retrying an operation, missing secondary data, etc.)
|
||||
SeverityInfoLevel: "INFO", // Generally useful information to log (service start/stop, configuration assumptions, etc). Info I want to always have available but usually don't care about under normal circumstances. This is my out-of-the-box config level.
|
||||
SeverityDebugLevel: "DEBUG", // Information that is diagnostically helpful to people more than just developers (IT, sysadmins, etc.).
|
||||
SeverityTraceLevel: "TRACE", // Only when I would be "tracing" the code and trying to find one part of a function specifically.
|
||||
}
|
||||
)
|
|
@ -0,0 +1,12 @@
|
|||
package logger
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
// Fatal ...
|
||||
func Fatal(content string, data LogData) {
|
||||
jsonData, _ := json.Marshal(data)
|
||||
zapLogger.Fatal(content, zap.String("data", string(jsonData)))
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package logger
|
||||
|
||||
type SignozConfiguration struct {
|
||||
HttpEndPoint string // Example: http://signoz:2255
|
||||
ServiceName string // Name server
|
||||
}
|
||||
|
||||
type SignozLogPayload struct {
|
||||
SeverityLevel int `json:"severity_level"`
|
||||
Message string `json:"message"`
|
||||
Data interface{} `json:"data"`
|
||||
}
|
||||
|
||||
// PRIVATE
|
||||
type logData struct {
|
||||
SeverityNumber int `json:"severity_number"`
|
||||
SeverityText string `json:"severity_text"`
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
TraceID string `json:"trace_id"`
|
||||
SpanID string `json:"span_id"`
|
||||
Message string `json:"message"`
|
||||
Source string `json:"source"`
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
package logger
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
cfgSignoz SignozConfiguration
|
||||
)
|
||||
|
||||
// InitSignoz ...
|
||||
func InitSignoz(config SignozConfiguration) {
|
||||
cfgSignoz = config
|
||||
}
|
||||
|
||||
// SendLogToSignoz ...
|
||||
func SendLogToSignoz(ctx context.Context, payload SignozLogPayload) error {
|
||||
client := http.Client{}
|
||||
b := generateBody(ctx, payload)
|
||||
r, errRequest := http.NewRequest(http.MethodPost, cfgSignoz.HttpEndPoint, bytes.NewBuffer(b))
|
||||
if errRequest != nil {
|
||||
return errRequest
|
||||
}
|
||||
r.Header.Set("Content-Type", "application/json")
|
||||
resp, errRequest := client.Do(r)
|
||||
if errRequest != nil {
|
||||
return errRequest
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateBody(ctx context.Context, info SignozLogPayload) []byte {
|
||||
var (
|
||||
timestamp = time.Now().Unix()
|
||||
payload = logData{
|
||||
SeverityNumber: info.SeverityLevel,
|
||||
SeverityText: getSeverityLevelText(info.SeverityLevel),
|
||||
Timestamp: timestamp,
|
||||
Source: cfgSignoz.ServiceName,
|
||||
Message: "",
|
||||
}
|
||||
)
|
||||
body := map[string]interface{}{
|
||||
"message": info.Message,
|
||||
"level_number": info.SeverityLevel,
|
||||
"level": getSeverityLevelText(info.SeverityLevel),
|
||||
"request_id": "",
|
||||
"data": info.Data,
|
||||
}
|
||||
rid := ctx.Value(CtxKeyRequestID)
|
||||
if rid != nil {
|
||||
body["request_id"] = rid.(string)
|
||||
payload.TraceID = rid.(string)
|
||||
payload.SpanID = rid.(string)
|
||||
}
|
||||
msg, _ := json.Marshal(body)
|
||||
payload.Message = string(msg)
|
||||
b, _ := json.Marshal(payload)
|
||||
return b
|
||||
}
|
||||
|
||||
func getSeverityLevelText(level int) string {
|
||||
return MapStringSeverityLevel[level]
|
||||
}
|
Loading…
Reference in New Issue