iop/packages/observability/observability.go
toki b4c6550eab feat: edge/node architecture updates and agent-task integration
- Add node store implementation for edge app
- Add adapters factory for node app
- Update edge and node transport layers
- Update domain rules for edge and node
- Add bin scripts for edge and node
- Update configs and documentation
- Add agent-task node_centralized_mgmt directory
2026-05-03 10:51:29 +09:00

70 lines
1.7 KiB
Go

package observability
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// NewLogger creates a zap production logger at the given level.
func NewLogger(level string, pretty bool) (*zap.Logger, error) {
lvl, err := zapcore.ParseLevel(level)
if err != nil {
lvl = zapcore.InfoLevel
}
cfg := zap.NewProductionConfig()
cfg.Level = zap.NewAtomicLevelAt(lvl)
if !pretty {
return cfg.Build()
}
encoder := zapcore.NewJSONEncoder(cfg.EncoderConfig)
sink := &prettyJSONWriteSyncer{out: zapcore.Lock(zapcore.AddSync(os.Stderr))}
core := zapcore.NewCore(encoder, sink, cfg.Level)
return zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel)), nil
}
type prettyJSONWriteSyncer struct {
out zapcore.WriteSyncer
}
func (w *prettyJSONWriteSyncer) Write(p []byte) (int, error) {
trimmed := bytes.TrimSpace(p)
if len(trimmed) == 0 {
return len(p), nil
}
var pretty bytes.Buffer
if err := json.Indent(&pretty, trimmed, "", " "); err != nil {
_, writeErr := w.out.Write(p)
return len(p), writeErr
}
pretty.WriteByte('\n')
_, err := w.out.Write(pretty.Bytes())
return len(p), err
}
func (w *prettyJSONWriteSyncer) Sync() error {
return w.out.Sync()
}
// ServeMetrics starts a Prometheus /metrics endpoint on the given port.
// It blocks until the server exits.
func ServeMetrics(port int) error {
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("ok"))
})
addr := fmt.Sprintf(":%d", port)
return http.ListenAndServe(addr, mux)
}