Skip to content

Commit 56fc1df

Browse files
committed
Severity impl fmt.Stringer
1 parent a4cbe9a commit 56fc1df

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

processors/minsev/severity.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package minsev // import "go.opentelemetry.io/contrib/processors/minsev"
55

66
import (
7+
"fmt"
78
"sync/atomic"
89

910
"go.opentelemetry.io/otel/log"
@@ -15,6 +16,9 @@ import (
1516
// as errors and critical events).
1617
type Severity int
1718

19+
// Ensure Severity implements fmt.Stringer.
20+
var _ fmt.Stringer = Severity(0)
21+
1822
// Severity values defined by OpenTelemetry.
1923
const (
2024
// A fine-grained debugging log record. Typically disabled in default
@@ -99,6 +103,50 @@ var translations = map[Severity]log.Severity{
99103
SeverityFatal4: log.SeverityFatal4,
100104
}
101105

106+
// String returns a name for the severity level. If the severity level has a
107+
// name, then that name in uppercase is returned. If the severity level is
108+
// outside named values, then an signed integer is appended to the uppercased
109+
// name.
110+
//
111+
// Examples:
112+
//
113+
// SeverityWarn1.String() => "WARN"
114+
// (SeverityInfo1+2).String() => "INFO2"
115+
// (SeverityFatal4+2).String() => "FATAL+6"
116+
// (SeverityTrace1-3).String() => "TRACE-3"
117+
func (s Severity) String() string {
118+
str := func(base string, val Severity) string {
119+
switch val {
120+
case 0:
121+
return base
122+
case 1, 2, 3:
123+
// No sign for known fine-grained severity values.
124+
return fmt.Sprintf("%s%d", base, val+1)
125+
}
126+
127+
if val > 0 {
128+
// Exclude zero from positive scale count.
129+
val++
130+
}
131+
return fmt.Sprintf("%s%+d", base, val)
132+
}
133+
134+
switch {
135+
case s < SeverityDebug1:
136+
return str("TRACE", s-SeverityTrace1)
137+
case s < SeverityInfo1:
138+
return str("DEBUG", s-SeverityDebug1)
139+
case s < SeverityWarn1:
140+
return str("INFO", s-SeverityInfo1)
141+
case s < SeverityError1:
142+
return str("WARN", s-SeverityWarn1)
143+
case s < SeverityFatal1:
144+
return str("ERROR", s-SeverityError1)
145+
default:
146+
return str("FATAL", s-SeverityFatal1)
147+
}
148+
}
149+
102150
// A SeverityVar is a [Severity] variable, to allow a [LogProcessor] severity
103151
// to change dynamically. It implements [Severitier] as well as a Set method,
104152
// and it is safe for use by multiple goroutines.

processors/minsev/severity_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"sync"
88
"testing"
99

10+
"github.com/stretchr/testify/assert"
1011
"go.opentelemetry.io/otel/log"
1112
)
1213

@@ -36,3 +37,54 @@ func TestSeverityVarConcurrentSafe(*testing.T) {
3637

3738
wg.Wait()
3839
}
40+
41+
var validEncodingTests = []struct {
42+
Name string
43+
Severity Severity
44+
Text string
45+
}{
46+
// Use offset for values less than SeverityTrace1.
47+
{"SeverityTraceMinus2", SeverityTrace - 2, "TRACE-2"},
48+
49+
{"SeverityTrace", SeverityTrace, "TRACE"},
50+
{"SeverityTrace1", SeverityTrace1, "TRACE"},
51+
{"SeverityTrace2", SeverityTrace2, "TRACE2"},
52+
{"SeverityTrace3", SeverityTrace3, "TRACE3"},
53+
{"SeverityTrace4", SeverityTrace4, "TRACE4"},
54+
{"SeverityDebug", SeverityDebug, "DEBUG"},
55+
{"SeverityDebug1", SeverityDebug1, "DEBUG"},
56+
{"SeverityDebug2", SeverityDebug2, "DEBUG2"},
57+
{"SeverityDebug3", SeverityDebug3, "DEBUG3"},
58+
{"SeverityDebug4", SeverityDebug4, "DEBUG4"},
59+
{"SeverityInfo", SeverityInfo, "INFO"},
60+
{"SeverityInfo1", SeverityInfo1, "INFO"},
61+
{"SeverityInfo2", SeverityInfo2, "INFO2"},
62+
{"SeverityInfo3", SeverityInfo3, "INFO3"},
63+
{"SeverityInfo4", SeverityInfo4, "INFO4"},
64+
{"SeverityWarn", SeverityWarn, "WARN"},
65+
{"SeverityWarn1", SeverityWarn1, "WARN"},
66+
{"SeverityWarn2", SeverityWarn2, "WARN2"},
67+
{"SeverityWarn3", SeverityWarn3, "WARN3"},
68+
{"SeverityWarn4", SeverityWarn4, "WARN4"},
69+
{"SeverityError", SeverityError, "ERROR"},
70+
{"SeverityError1", SeverityError1, "ERROR"},
71+
{"SeverityError2", SeverityError2, "ERROR2"},
72+
{"SeverityError3", SeverityError3, "ERROR3"},
73+
{"SeverityError4", SeverityError4, "ERROR4"},
74+
{"SeverityFatal", SeverityFatal, "FATAL"},
75+
{"SeverityFatal1", SeverityFatal1, "FATAL"},
76+
{"SeverityFatal2", SeverityFatal2, "FATAL2"},
77+
{"SeverityFatal3", SeverityFatal3, "FATAL3"},
78+
{"SeverityFatal4", SeverityFatal4, "FATAL4"},
79+
80+
// Use offset for values greater than SeverityFatal4.
81+
{"SeverityFatal4Plus2", SeverityFatal4 + 2, "FATAL+6"},
82+
}
83+
84+
func TestSeverityString(t *testing.T) {
85+
for _, test := range validEncodingTests {
86+
t.Run(test.Name, func(t *testing.T) {
87+
assert.Equal(t, test.Text, test.Severity.String())
88+
})
89+
}
90+
}

0 commit comments

Comments
 (0)