Skip to content

Commit

Permalink
Clean
Browse files Browse the repository at this point in the history
  • Loading branch information
AGMETEOR committed Jan 21, 2025
1 parent a6c5371 commit a2219ba
Show file tree
Hide file tree
Showing 6 changed files with 258 additions and 68 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ require (
github.com/mdlayher/netlink v1.7.2 // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/mholt/archiver/v3 v3.5.1 // indirect
github.com/mitchellh/mapstructure v1.5.0
github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 // indirect
github.com/mschoch/smat v0.2.0 // indirect
github.com/nwaples/rardecode v1.1.2 // indirect
Expand Down Expand Up @@ -218,6 +219,7 @@ require (
github.com/tklauser/go-sysconf v0.3.9 // indirect
github.com/tklauser/numcpus v0.3.0 // indirect
github.com/ulikunitz/xz v0.5.11 // indirect
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2
github.com/vishvananda/netns v0.0.4 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,8 @@ github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Cl
github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
github.com/mitchellh/go-server-timing v1.0.0 h1:cdHk4f7lxjwbRqTSGZFw8PCeoNYXGp4T4Sdr8wT+Xlw=
github.com/mitchellh/go-server-timing v1.0.0/go.mod h1:RdipKQzCJaL4HyxFQBINbf4XoDdZKkSshqw9Bbsx1ic=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104 h1:ULR/QWMgcgRiZLUjSSJMU+fW+RDMstRdmnDWj9Q+AsA=
github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
Expand Down Expand Up @@ -703,6 +705,8 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2 h1:3/aHKUq7qaFMWxyQV0W2ryNgg8x8rVeKVA20KJUkfS0=
github.com/uptrace/opentelemetry-go-extra/otelutil v0.3.2/go.mod h1:Zit4b8AQXaXvA68+nzmbyDzqiyFRISyw1JiD5JqUBjw=
github.com/vharitonsky/iniflags v0.0.0-20180513140207-a33cd0b5f3de h1:fkw+7JkxF3U1GzQoX9h69Wvtvxajo5Rbzy6+YMMzPIg=
github.com/vharitonsky/iniflags v0.0.0-20180513140207-a33cd0b5f3de/go.mod h1:irMhzlTz8+fVFj6CH2AN2i+WI5S6wWFtK3MBCIxIpyI=
github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
Expand Down
9 changes: 8 additions & 1 deletion http-proxy/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
proxy "github.com/getlantern/http-proxy-lantern/v2"
"github.com/getlantern/http-proxy-lantern/v2/blacklist"
"github.com/getlantern/http-proxy-lantern/v2/googlefilter"
"github.com/getlantern/http-proxy-lantern/v2/logger"
"github.com/getlantern/http-proxy-lantern/v2/obfs4listener"
lanternredis "github.com/getlantern/http-proxy-lantern/v2/redis"
"github.com/getlantern/http-proxy-lantern/v2/shadowsocks"
Expand All @@ -37,7 +38,8 @@ import (
)

var (
log = golog.LoggerFor("lantern-proxy")
// log = golog.LoggerFor("lantern-proxy")
log = logger.InitLogger("http-proxy", nil)
revision = "unknown" // overridden by Makefile
build_type = "unknown" // overriden by Makefile

Expand Down Expand Up @@ -216,6 +218,11 @@ func main() {
return
}

log = logger.InitLogger("http-proxy", &logger.Opts{
HostMachine: *proxyName,
TrackName: *track,
})

var reporter *stackdrivererror.Reporter
if *stackdriverProjectID != "" && *stackdriverCreds != "" {
reporter = stackdrivererror.Enable(context.Background(), *stackdriverProjectID, *stackdriverCreds, *stackdriverSamplePercentage, *proxyName, *externalIP, *proxyProtocol, *track)
Expand Down
10 changes: 0 additions & 10 deletions http_proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,11 +270,6 @@ func (p *Proxy) ListenAndServe(ctx context.Context) error {
},
})

go func() {
for i := 0; i < 100; i++ {
otel.Debug(ctx, "TESTING OTEL LOGGER 123...")
}
}()
stopProxiedBytes := p.configureTeleportProxiedBytes()
defer stopProxiedBytes()

Expand All @@ -295,11 +290,8 @@ func (p *Proxy) ListenAndServe(ctx context.Context) error {
allListeners := make([]net.Listener, 0)
listenerProtocols := make([]string, 0)

otel.Debug(ctx, "TESTING OTEL LOGGER 123...")

listenerArgs := getProtoListenersArgs(p)
for _, args := range listenerArgs {
otel.Debug(ctx, "TESTING OTEL LOGGER 123...")
if args.addr == "" {
continue
}
Expand All @@ -315,8 +307,6 @@ func (p *Proxy) ListenAndServe(ctx context.Context) error {
allListeners = append(allListeners, listeners.NewAllowingListener(l, blacklist.OnConnect))
}

otel.Debug(ctx, "TESTING OTEL LOGGER 123...")

errCh := make(chan error, len(allListeners))
if p.EnableMultipath {
mpl := multipath.NewListener(allListeners, p.instrument.MultipathStats(listenerProtocols))
Expand Down
244 changes: 244 additions & 0 deletions logger/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
package logger

import (
"context"
"fmt"
"path"
"reflect"
"runtime"
"time"

"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/sdk/resource"

"github.com/getlantern/golog"
"github.com/mitchellh/mapstructure"
"github.com/uptrace/opentelemetry-go-extra/otelutil"
otlpLog "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"
otelLog "go.opentelemetry.io/otel/log"
otelLogSdk "go.opentelemetry.io/otel/sdk/log"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
)

const (
otelEndpoint = "172.16.0.88:4318"
otelServiceName = "http-proxy-lantern"
)

// wraps both an otel logger and std logger
type ProxyLogger struct {
initializedOtel bool
stdLogger golog.Logger
otelLogger otelLog.Logger
}

type Opts struct {
HostMachine string
TrackName string
RouteName string
}

func (o *Opts) attrKV() []attribute.KeyValue {
return []attribute.KeyValue{
attribute.String("phost", o.HostMachine),
attribute.String("track", o.TrackName),
attribute.String("route", o.RouteName),
}
}

// convertFields converts various types of fields into a slice of key-value pairs.
func convertFields(fields ...any) []any {
var result []any
for _, field := range fields {
switch v := field.(type) {
case []interface{}:
for i := 0; i < len(v); i += 2 {
if i+1 < len(v) {
result = append(result, v[i], v[i+1])
}
}
default:
val := reflect.ValueOf(v)
if val.Kind() == reflect.Map {
for _, key := range val.MapKeys() {
result = append(result, key.Interface(), val.MapIndex(key).Interface())
}
} else if val.Kind() == reflect.Struct {
var mapResult map[string]interface{}
err := mapstructure.Decode(v, &mapResult)
if err == nil {
result = append(result, v)
}

} else {
result = append(result, v)
}
}
}
return result
}

func kvAttributes(vs []any) []otelLog.KeyValue {
res := make([]otelLog.KeyValue, 0, len(vs)/2)

var i int
for i = 0; i+1 < len(vs); i += 2 {
k, ok := vs[i].(string)
if !ok {
res = append(res, otelLog.String("logError", fmt.Sprintf("%+v is not a string key", vs[i])))
}
res = append(res, otelLog.KeyValue{Key: k, Value: otelutil.LogValue(vs[i+1])})
}

if i < len(vs) {
res = append(res, otelLog.KeyValue{Key: "_EXTRA", Value: otelutil.LogValue(vs[i])})
}

return res
}

func InitLogger(loggerLoc string, opts *Opts) *ProxyLogger {
goLog := golog.LoggerFor(loggerLoc)
p := &ProxyLogger{
stdLogger: goLog,
}

if opts == nil {
return p
}

expLog, err := otlpLog.New(context.Background(),
otlpLog.WithEndpoint(otelEndpoint),
otlpLog.WithInsecure(), // the endpoint is on the lo interface, so this "might" be safe
)
if err != nil {
return p
}

resourceAttributes := []attribute.KeyValue{semconv.ServiceNameKey.String(otelServiceName), attribute.String("logger_location", loggerLoc)}
resourceAttributes = append(resourceAttributes, opts.attrKV()...)

r := resource.NewWithAttributes(semconv.SchemaURL, resourceAttributes...)
provider := otelLogSdk.NewLoggerProvider(
otelLogSdk.WithProcessor(otelLogSdk.NewBatchProcessor(expLog)),
otelLogSdk.WithResource(r),
)

p.otelLogger = provider.Logger(otelServiceName)
p.initializedOtel = true
return p
}

func (pl *ProxyLogger) writeLog(severity otelLog.Severity, message string, fields ...any) {
if pl.otelLogger == nil {
return
}
var record otelLog.Record
record.SetTimestamp(time.Now())
record.SetBody(otelLog.StringValue(message))
record.SetSeverity(severity)
record.SetSeverityText(severity.String())

fields = convertFields(fields...)
record.AddAttributes(kvAttributes(fields)...)

if pc, file, line, ok := runtime.Caller(2); ok {
fn := ""
if function := runtime.FuncForPC(pc); function != nil {
fn = function.Name()
}
record.AddAttributes(otelLog.String("file", path.Base(file)), otelLog.Int64("line", int64(line)), otelLog.String("function", fn))
}

pl.otelLogger.Emit(context.Background(), record)
}

func (pl *ProxyLogger) Debug(message string) {
if pl.stdLogger != nil {
pl.stdLogger.Debug(message)
}
pl.writeLog(otelLog.SeverityDebug, message)
}

func (pl *ProxyLogger) Debugf(format string, args ...any) {
if pl.stdLogger != nil {
pl.stdLogger.Debugf(format, args...)
}
pl.writeLog(otelLog.SeverityDebug, format, args...)
}

func (pl *ProxyLogger) Fatal(message any) {
if pl.stdLogger != nil {
pl.stdLogger.Fatal(message)
}

var msg string

switch v := message.(type) {
case error:
msg = v.Error()
case fmt.Stringer:
msg = v.String()
case string:
msg = v
default:
msg = "unknown error"
return
}

pl.writeLog(otelLog.SeverityFatal, msg)
}

func (pl *ProxyLogger) Fatalf(format string, args ...any) {
if pl.stdLogger != nil {
pl.stdLogger.Fatalf(format, args...)
}
pl.writeLog(otelLog.SeverityFatal, format, args...)
}

func (pl *ProxyLogger) Trace(message string) {
if pl.stdLogger != nil {
pl.stdLogger.Trace(message)
}
pl.writeLog(otelLog.SeverityTrace, message)
}

func (pl *ProxyLogger) Tracef(format string, args ...any) {
if pl.stdLogger != nil {
pl.stdLogger.Tracef(format, args...)
}
pl.writeLog(otelLog.SeverityTrace, format, args...)
}

func (pl *ProxyLogger) Error(message any) {
var msg string

switch v := message.(type) {
case error:
msg = v.Error()
case fmt.Stringer:
msg = v.String()
case string:
msg = v
default:
msg = "unknown error"
return
}

if pl.stdLogger != nil {
pl.stdLogger.Error(msg)
}

pl.writeLog(otelLog.SeverityError, msg)
}

func (pl *ProxyLogger) Errorf(format string, args ...any) {
if pl.stdLogger != nil {
pl.stdLogger.Errorf(format, args...)
}

err := fmt.Errorf(format, args...)
msg := err.Error()

pl.writeLog(otelLog.SeverityError, msg)
}
57 changes: 0 additions & 57 deletions otel/logger.go

This file was deleted.

0 comments on commit a2219ba

Please sign in to comment.