-
InfluxDB
Power Real-Time Data Analytics at Scale. Get real-time insights from all types of time series data with InfluxDB. Ingest, query, and analyze billions of data points in real-time with unbounded cardinality.
package logx import ( "fmt" "net/http" ) func info(r *http.Request, message interface{}, projectID string) { get := r.Header.Get("X-Cloud-Trace-Context") traceID, spanID, traceSampled := deconstructXCloudTraceContext(get) traceID = fmt.Sprintf("projects/%s/traces/%s", projectID, traceID) entry := logEntry{ Severity: "INFO", Message: message, HttpRequest: &httpRequest{ RequestMethod: r.Method, RequestUrl: r.URL.String(), UserAgent: r.UserAgent(), RemoteIp: r.RemoteAddr, Referer: r.Referer(), }, Timestamp: time.Now(), Labels: map[string]string{"labels": "rock"}, SpanID: spanID, TraceID: traceID, TraceSampled: traceSampled, } writelog(&entry) } func writelog(entry *logEntry) { if err := json.NewEncoder(os.Stderr).Encode(entry); err != nil { fmt.Printf("failure to write structured log entry: %v", err) } } // taken from https://github.com/googleapis/google-cloud-go/blob/master/logging/logging.go#L774 var reCloudTraceContext = regexp.MustCompile( // Matches on "TRACE_ID" `([a-f\d]+)?` + // Matches on "/SPAN_ID" `(?:/([a-f\d]+))?` + // Matches on ";0=TRACE_TRUE" `(?:;o=(\d))?`) func deconstructXCloudTraceContext(s string) (traceID, spanID string, traceSampled bool) { // As per the format described at https://cloud.google.com/trace/docs/setup#force-trace // "X-Cloud-Trace-Context: TRACE_ID/SPAN_ID;o=TRACE_TRUE" // for example: // "X-Cloud-Trace-Context: 105445aa7843bc8bf206b120001000/1;o=1" // // We expect: // * traceID (optional): "105445aa7843bc8bf206b120001000" // * spanID (optional): "1" // * traceSampled (optional): true matches := reCloudTraceContext.FindStringSubmatch(s) traceID, spanID, traceSampled = matches[1], matches[2], matches[3] == "1" if spanID == "0" { spanID = "" } return }