From 30d27a521a45c02b4d0dc70d93e517a0d11546d1 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Sat, 13 Aug 2022 21:08:39 +0100
Subject: [PATCH] Update ldap pkg to use the opentelemetry API

---
 go.mod       |  1 -
 ldap/pool.go | 53 +++++++++++++++++++++++++++++-----------------------
 2 files changed, 30 insertions(+), 24 deletions(-)

diff --git a/go.mod b/go.mod
index 1cd27dc..4d73b1c 100644
--- a/go.mod
+++ b/go.mod
@@ -20,7 +20,6 @@ require (
 	github.com/prometheus/client_golang v1.12.2
 	github.com/russross/blackfriday/v2 v2.1.0
 	github.com/theckman/go-flock v0.8.1
-	go.opencensus.io v0.23.0
 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.34.0
 	go.opentelemetry.io/otel v1.9.0
 	go.opentelemetry.io/otel/exporters/zipkin v1.9.0
diff --git a/ldap/pool.go b/ldap/pool.go
index a13887d..a605d81 100644
--- a/ldap/pool.go
+++ b/ldap/pool.go
@@ -7,10 +7,13 @@ import (
 	"net/url"
 	"time"
 
+	"git.autistici.org/ai3/go-common/tracing"
 	"github.com/cenkalti/backoff/v4"
 	"github.com/go-ldap/ldap/v3"
 	"github.com/prometheus/client_golang/prometheus"
-	"go.opencensus.io/trace"
+	"go.opentelemetry.io/otel/attribute"
+	"go.opentelemetry.io/otel/codes"
+	"go.opentelemetry.io/otel/trace"
 )
 
 // Parameters that define the exponential backoff algorithm used.
@@ -153,18 +156,20 @@ func NewConnectionPool(uri, bindDN, bindPw string, cacheSize int) (*ConnectionPo
 	}, nil
 }
 
-func (p *ConnectionPool) doRequest(ctx context.Context, name string, attrs []trace.Attribute, fn func(*ldap.Conn) error) error {
+func (p *ConnectionPool) doRequest(ctx context.Context, name string, attrs []attribute.KeyValue, fn func(*ldap.Conn) error) error {
 	// Tracing: initialize a new client span.
-	sctx, span := trace.StartSpan(ctx, name,
-		trace.WithSpanKind(trace.SpanKindClient))
-	defer span.End()
+	var span trace.Span
+	if tracing.Enabled {
+		ctx, span = tracing.Tracer.Start(ctx, name)
+		defer span.End()
 
-	if len(attrs) > 0 {
-		span.AddAttributes(attrs...)
+		if len(attrs) > 0 {
+			span.SetAttributes(attrs...)
+		}
 	}
 
 	rerr := backoff.Retry(func() error {
-		conn, err := p.Get(sctx)
+		conn, err := p.Get(ctx)
 		if err != nil {
 			// Here conn is nil, so we don't need to Release it.
 			if isTemporaryLDAPError(err) {
@@ -173,7 +178,7 @@ func (p *ConnectionPool) doRequest(ctx context.Context, name string, attrs []tra
 			return backoff.Permanent(err)
 		}
 
-		if deadline, ok := sctx.Deadline(); ok {
+		if deadline, ok := ctx.Deadline(); ok {
 			conn.SetTimeout(time.Until(deadline))
 		}
 
@@ -186,7 +191,9 @@ func (p *ConnectionPool) doRequest(ctx context.Context, name string, attrs []tra
 	}, backoff.WithContext(newExponentialBackOff(), ctx))
 
 	// Tracing: set the final status.
-	span.SetStatus(errorToTraceStatus(rerr))
+	if span != nil {
+		span.SetStatus(errorToTraceStatus(rerr))
+	}
 	requestsCounter.WithLabelValues(name).Inc()
 	if rerr != nil {
 		requestErrors.WithLabelValues(name).Inc()
@@ -199,10 +206,10 @@ func (p *ConnectionPool) doRequest(ctx context.Context, name string, attrs []tra
 // on temporary errors.
 func (p *ConnectionPool) Search(ctx context.Context, searchRequest *ldap.SearchRequest) (*ldap.SearchResult, error) {
 	var result *ldap.SearchResult
-	err := p.doRequest(ctx, "ldap.Search", []trace.Attribute{
-		trace.StringAttribute("ldap.base", searchRequest.BaseDN),
-		trace.StringAttribute("ldap.filter", searchRequest.Filter),
-		trace.Int64Attribute("ldap.scope", int64(searchRequest.Scope)),
+	err := p.doRequest(ctx, "ldap.Search", []attribute.KeyValue{
+		attribute.String("ldap.base", searchRequest.BaseDN),
+		attribute.String("ldap.filter", searchRequest.Filter),
+		attribute.Int64("ldap.scope", int64(searchRequest.Scope)),
 	}, func(conn *ldap.Conn) (cerr error) {
 		result, cerr = conn.Search(searchRequest)
 		return
@@ -212,8 +219,8 @@ func (p *ConnectionPool) Search(ctx context.Context, searchRequest *ldap.SearchR
 
 // Modify issues a ModifyRequest to the LDAP server.
 func (p *ConnectionPool) Modify(ctx context.Context, modifyRequest *ldap.ModifyRequest) error {
-	return p.doRequest(ctx, "ldap.Modify", []trace.Attribute{
-		trace.StringAttribute("ldap.dn", modifyRequest.DN),
+	return p.doRequest(ctx, "ldap.Modify", []attribute.KeyValue{
+		attribute.String("ldap.dn", modifyRequest.DN),
 	}, func(conn *ldap.Conn) error {
 		return conn.Modify(modifyRequest)
 	})
@@ -221,8 +228,8 @@ func (p *ConnectionPool) Modify(ctx context.Context, modifyRequest *ldap.ModifyR
 
 // Add issues an AddRequest to the LDAP server.
 func (p *ConnectionPool) Add(ctx context.Context, addRequest *ldap.AddRequest) error {
-	return p.doRequest(ctx, "ldap.Add", []trace.Attribute{
-		trace.StringAttribute("ldap.dn", addRequest.DN),
+	return p.doRequest(ctx, "ldap.Add", []attribute.KeyValue{
+		attribute.String("ldap.dn", addRequest.DN),
 	}, func(conn *ldap.Conn) error {
 		return conn.Add(addRequest)
 	})
@@ -262,16 +269,16 @@ func isProtocolError(err error) bool {
 	return false
 }
 
-func errorToTraceStatus(err error) trace.Status {
+func errorToTraceStatus(err error) (codes.Code, string) {
 	switch err {
 	case nil:
-		return trace.Status{Code: trace.StatusCodeOK, Message: "OK"}
+		return codes.Ok, "OK"
 	case context.Canceled:
-		return trace.Status{Code: trace.StatusCodeCancelled, Message: "CANCELED"}
+		return codes.Error, "CANCELED"
 	case context.DeadlineExceeded:
-		return trace.Status{Code: trace.StatusCodeDeadlineExceeded, Message: "DEADLINE_EXCEEDED"}
+		return codes.Error, "DEADLINE_EXCEEDED"
 	default:
-		return trace.Status{Code: trace.StatusCodeUnknown, Message: err.Error()}
+		return codes.Error, err.Error()
 	}
 }
 
-- 
GitLab