Log spans

This commit is contained in:
iacore
2024-08-28 13:52:28 +00:00
parent 9ed08d78b8
commit 2aa6f52218
7 changed files with 78 additions and 38 deletions
+19
View File
@@ -0,0 +1,19 @@
package audit
import (
"log"
"github.com/openzipkin/zipkin-go/model"
)
type LogReporter struct {
l *log.Logger
}
func (rr LogReporter) Send(m model.SpanModel) {
rr.l.Print(m.Name)
}
func (rr LogReporter) Close() error {
return nil
}
+46 -10
View File
@@ -9,23 +9,59 @@ import (
"path"
"time"
"github.com/openzipkin/zipkin-go"
"github.com/openzipkin/zipkin-go/reporter"
http_reporter "github.com/openzipkin/zipkin-go/reporter/http"
"codeberg.org/vnpower/pixivfe/v2/config"
"codeberg.org/vnpower/pixivfe/v2/handlers/user_context"
"codeberg.org/vnpower/pixivfe/v2/utils"
"github.com/openzipkin/zipkin-go"
)
const DevDir_Response = "/tmp/pixivfe-dev/resp"
var optionSaveResponse bool
func Init(saveResponse bool, tracer *zipkin.Tracer) error {
func Init(saveResponse bool) error {
optionSaveResponse = saveResponse
utils.Tracer = tracer
if optionSaveResponse {
return os.MkdirAll(DevDir_Response, 0o700)
} else {
return nil
err := os.MkdirAll(DevDir_Response, 0o700)
if err != nil {
return err
}
}
var reporter reporter.Reporter = nil
_, enableReporting := config.LookupEnv("PIXIVFE_ENABLE_ZIPKIN")
if enableReporting {
reporter = http_reporter.NewReporter("http://localhost:9411/api/v2/spans")
defer func() {
_ = reporter.Close()
}()
} else {
// comment out this block in logging is too verbose
reporter = LogReporter{l: log.New(os.Stderr, "", log.Flags())}
defer func() {
_ = reporter.Close()
}()
}
// this is purely theoretical. the port is used for distributed tracing.
endpoint, err := zipkin.NewEndpoint("pixivfe", "localhost:8282")
if err != nil {
log.Fatalf("unable to create local endpoint: %+v\n", err)
}
// initialize our tracer
tracer, err := zipkin.NewTracer(reporter, zipkin.WithLocalEndpoint(endpoint))
if err != nil {
log.Fatalf("unable to create tracer: %+v\n", err)
}
utils.Tracer = tracer
return nil
}
type ServerPerformance struct {
@@ -56,7 +92,7 @@ func LogServerRoundTrip(context context.Context, perf ServerPerformance) {
log.Printf("Internal Server Error: %s", perf.Error)
}
span, _ := utils.Tracer.StartSpanFromContext(context, fmt.Sprintf("Served %v %v %v %v", perf.Method, perf.Path, perf.Status, perf.Error), zipkin.StartTime(perf.StartTime), zipkin.Parent(user_context.GetUserContext(context).Parent))
span, _ := utils.Tracer.StartSpanFromContext(context, fmt.Sprintf("%v %v %v %v", perf.Method, perf.Path, perf.Status, perf.Error), zipkin.StartTime(perf.StartTime), zipkin.Parent(user_context.GetUserContext(context).Parent))
span.Tag("RemoteAddr", perf.RemoteAddr)
span.FinishedWithDuration(perf.EndTime.Sub(perf.StartTime))
}
@@ -67,13 +103,13 @@ func LogAPIRoundTrip(context context.Context, perf APIPerformance) {
var err error
perf.ResponseFilename, err = writeResponseBodyToFile(perf.Body)
if err != nil {
log.Println("When saving response to file: ", err)
log.Print("When saving response to file: ", err)
} else {
log.Println(fmt.Sprintf("[API] %v %v saved to %v", perf.Method, perf.Url, perf.ResponseFilename))
log.Printf("[API] %v %v saved to %v", perf.Method, perf.Url, perf.ResponseFilename)
}
}
if !(300 > perf.Response.StatusCode && perf.Response.StatusCode >= 200) {
log.Println("(WARN) non-2xx response from pixiv:")
log.Print("(WARN) non-2xx response from pixiv:")
}
}
span, _ := utils.Tracer.StartSpanFromContext(context, fmt.Sprintf("API %v %v %v", perf.Method, perf.Url, perf.Error), zipkin.StartTime(perf.StartTime), zipkin.Parent(user_context.GetUserContext(context).Parent))
+5
View File
@@ -110,6 +110,11 @@ var EnvList []*EnvVar = []*EnvVar{
// The interval in minutes between proxy checks. Defaults to 480 minutes (8 hours) if not set.
// You can disable this by setting the value to 0. Then, proxies will only be checked once at server initialization.
},
{
Name: "PIXIVFE_ENABLE_ZIPKIN",
CommonName: "report spans to http://localhost:9411/api/v2/spans",
// **Required**: No
},
}
// ======================================================================
+3 -3
View File
@@ -31,14 +31,14 @@ func StartProxyChecker(r context.Context) {
for {
select {
case <-stopChan:
log.Println("Stopping proxy checker...")
log.Print("Stopping proxy checker...")
return
default:
checkProxies(r)
if t := GlobalServerConfig.ProxyCheckInterval; t > 0 {
time.Sleep(t)
} else {
log.Println("Proxy check interval set to 0, disabling auto-check from now on.")
log.Print("Proxy check interval set to 0, disabling auto-check from now on.")
select {} // Sweet dreams!
}
}
@@ -126,5 +126,5 @@ func logf(format string, v ...any) {
}
func logln(v ...any) {
log.Println(v...)
log.Print(v...)
}
+2 -22
View File
@@ -11,9 +11,6 @@ import (
"runtime"
"syscall"
"github.com/openzipkin/zipkin-go"
zipkin_httpreporter "github.com/openzipkin/zipkin-go/reporter/http"
"codeberg.org/vnpower/pixivfe/v2/audit"
"codeberg.org/vnpower/pixivfe/v2/config"
"codeberg.org/vnpower/pixivfe/v2/handlers"
@@ -21,25 +18,8 @@ import (
)
func main() {
reporter := zipkin_httpreporter.NewReporter("http://localhost:9411/api/v2/spans")
defer func() {
_ = reporter.Close()
}()
// this is purely theoretical. the port is used for distributed tracing.
endpoint, err := zipkin.NewEndpoint("pixivfe", "localhost:8282")
if err != nil {
log.Fatalf("unable to create local endpoint: %+v\n", err)
}
// initialize our tracer
tracer, err := zipkin.NewTracer(reporter, zipkin.WithLocalEndpoint(endpoint))
if err != nil {
log.Fatalf("unable to create tracer: %+v\n", err)
}
config.GlobalServerConfig.LoadConfig()
audit.Init(config.GlobalServerConfig.InDevelopment, tracer)
audit.Init(config.GlobalServerConfig.InDevelopment)
template.Init(config.GlobalServerConfig.InDevelopment)
// Initialize and start the proxy checker
@@ -67,7 +47,7 @@ func main() {
runtime.LockOSThread() // Go quirk https://github.com/golang/go/issues/27505
err := cmd.Run()
if err != nil {
log.Println(fmt.Errorf("when running sass: %w", err))
log.Print(fmt.Errorf("when running sass: %w", err))
}
}()
}
+2 -2
View File
@@ -27,7 +27,7 @@ func setup() {
log.Fatalf("could not launch browser: %v", err)
}
log.Println("Setup is complete")
log.Print("Setup is complete")
}
func teardown() {
@@ -38,7 +38,7 @@ func teardown() {
if err := pw.Stop(); err != nil {
log.Fatalf("could not stop Playwright: %v", err)
}
log.Println("Teardown is complete")
log.Print("Teardown is complete")
}
// TestMain can be used for global setup and teardown
+1 -1
View File
@@ -67,7 +67,7 @@ func manualTest[T any](t *testing.T, data T) {
log.Panicf("struct name does not start with 'Data_': %s", route_name)
}
// log.Println("Testing " + route_name)
// log.Print("Testing " + route_name)
variables := jet.VarMap{}