Skip to content

Commit 041faba

Browse files
author
Luke Kim
committed
Initial public release updates.
1 parent 736bacd commit 041faba

14 files changed

+335
-84
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@ _testmain.go
2222
*.exe
2323
*.test
2424
*.prof
25+
26+
# OS specific
27+
.DS_Store
File renamed without changes.
File renamed without changes.

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# ApplicationInsights-Go
22
Microsoft Application Insights SDK for Go
33

4-
This project provides a Go SDK for Application Insights. [Application Insights](http://azure.microsoft.com/en-us/services/application-insights/) is a service that allows developers to keep their applications available, performant, and successful. This go package will allow you to send telemetry of various kinds (event, trace, exception, etc.) to the Application Insights service where they can be visualized in the Azure Portal.
4+
This project provides a Go SDK for Application Insights. [Application Insights](http://azure.microsoft.com/en-us/services/application-insights/) is a service that allows developers to keep their applications available, performant, and successful. This go package will allow you to send telemetry of various kinds (event, metric, trace) to the Application Insights service where they can be visualized in the Azure Portal.
55

66
## Requirements ##
77
**Install**
@@ -19,10 +19,10 @@ import "github.com/Microsoft/ApplicationInsights-Go"
1919
client := appinsights.NewTelemetryClient("<instrumentation key>")
2020
client.TrackEvent("custom event")
2121
client.TrackMetric("custom metric", 123)
22-
client.TrackTrace("trace message"
22+
client.TrackTrace("trace message")
2323
```
2424

25-
## telpad example test and example app ##
25+
## telpad test and example app ##
2626

2727
The telpad app can be used to send test telemetry and as an example of using the SDK.
2828

appinsights/client.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ type TelemetryClient interface {
66
Context() TelemetryContext
77
InstrumentationKey() string
88
IsEnabled() bool
9-
SetIsEnabled(bool)
9+
SetIsEnabled(bool)
1010
Track(Telemetry)
1111
TrackEvent(string)
1212
TrackEventTelemetry(*EventTelemetry)
@@ -28,7 +28,7 @@ type telemetryClient struct {
2828
func NewTelemetryClient(iKey string) TelemetryClient {
2929
config := NewTelemetryConfiguration(iKey)
3030
channel := NewInMemoryChannel(config.EndpointUrl)
31-
context := NewTelemetryContext()
31+
context := NewClientTelemetryContext()
3232
return &telemetryClient{
3333
TelemetryConfiguration: config,
3434
channel: channel,
@@ -50,7 +50,7 @@ func (tc *telemetryClient) IsEnabled() bool {
5050
}
5151

5252
func (tc *telemetryClient) SetIsEnabled(isEnabled bool) {
53-
tc.isEnabled = isEnabled
53+
tc.isEnabled = isEnabled
5454
}
5555

5656
func (tc *telemetryClient) Track(item Telemetry) {
@@ -60,9 +60,16 @@ func (tc *telemetryClient) Track(item Telemetry) {
6060
iKey = tc.TelemetryConfiguration.InstrumentationKey
6161
}
6262

63-
item.Context().(*telemetryContext).iKey = iKey
63+
itemContext := item.Context().(*telemetryContext)
64+
itemContext.iKey = iKey
6465

65-
// TODO: Copy tc.context.Properties to item.Context().Properties
66+
clientContext := tc.context.(*telemetryContext)
67+
68+
for tagkey, tagval := range clientContext.tags {
69+
if itemContext.tags[tagkey] == "" {
70+
itemContext.tags[tagkey] = tagval
71+
}
72+
}
6673

6774
tc.channel.Send(item)
6875
}

appinsights/client_test.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package appinsights
2+
3+
import "testing"
4+
5+
func TestClientBurstPerformance(t *testing.T) {
6+
telemetryClient := NewTelemetryClient("")
7+
for i := 0; i < 1000000; i++ {
8+
telemetryClient.TrackTrace("A message")
9+
}
10+
}

appinsights/datacontracts.go

+36-36
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@ package appinsights
33
import "time"
44

55
type Telemetry interface {
6-
Timestamp() time.Time
7-
Context() TelemetryContext
6+
Timestamp() time.Time
7+
Context() TelemetryContext
88
baseTypeName() string
99
baseData() Domain
1010
}
1111

1212
type BaseTelemetry struct {
13-
timestamp time.Time
13+
timestamp time.Time
1414
context TelemetryContext
1515
}
1616

1717
type TraceTelemetry struct {
18-
BaseTelemetry
19-
data *messageData
18+
BaseTelemetry
19+
data *messageData
2020
}
2121

2222
func NewTraceTelemetry(message string, severityLevel SeverityLevel) *TraceTelemetry {
@@ -28,21 +28,21 @@ func NewTraceTelemetry(message string, severityLevel SeverityLevel) *TraceTeleme
2828
data.Ver = 2
2929

3030
item := &TraceTelemetry{
31-
data: data,
31+
data: data,
3232
}
33-
34-
item.timestamp = now
35-
item.context = &telemetryContext{}
36-
37-
return item
33+
34+
item.timestamp = now
35+
item.context = NewItemTelemetryContext()
36+
37+
return item
3838
}
3939

4040
func (item *TraceTelemetry) Timestamp() time.Time {
4141
return item.timestamp
4242
}
4343

4444
func (item *TraceTelemetry) Context() TelemetryContext {
45-
return item.context
45+
return item.context
4646
}
4747

4848
func (item *TraceTelemetry) baseTypeName() string {
@@ -55,7 +55,7 @@ func (item *TraceTelemetry) baseData() Domain {
5555

5656
type EventTelemetry struct {
5757
BaseTelemetry
58-
data *eventData
58+
data *eventData
5959
}
6060

6161
func NewEventTelemetry(name string) *EventTelemetry {
@@ -67,21 +67,21 @@ func NewEventTelemetry(name string) *EventTelemetry {
6767
data.Ver = 2
6868

6969
item := &EventTelemetry{
70-
data: data,
70+
data: data,
7171
}
72-
73-
item.timestamp = now
74-
item.context = &telemetryContext{}
75-
76-
return item
72+
73+
item.timestamp = now
74+
item.context = NewItemTelemetryContext()
75+
76+
return item
7777
}
7878

7979
func (item *EventTelemetry) Timestamp() time.Time {
8080
return item.timestamp
8181
}
8282

8383
func (item *EventTelemetry) Context() TelemetryContext {
84-
return item.context
84+
return item.context
8585
}
8686

8787
func (item *EventTelemetry) baseTypeName() string {
@@ -94,7 +94,7 @@ func (item *EventTelemetry) baseData() Domain {
9494

9595
type MetricTelemetry struct {
9696
BaseTelemetry
97-
data *metricData
97+
data *metricData
9898
}
9999

100100
func NewMetricTelemetry(name string, value float32) *MetricTelemetry {
@@ -113,21 +113,21 @@ func NewMetricTelemetry(name string, value float32) *MetricTelemetry {
113113
data.Metrics[0] = metric
114114

115115
item := &MetricTelemetry{
116-
data: data,
116+
data: data,
117117
}
118-
119-
item.timestamp = now
120-
item.context = &telemetryContext{}
121-
122-
return item
118+
119+
item.timestamp = now
120+
item.context = NewItemTelemetryContext()
121+
122+
return item
123123
}
124124

125125
func (item *MetricTelemetry) Timestamp() time.Time {
126126
return item.timestamp
127127
}
128128

129129
func (item *MetricTelemetry) Context() TelemetryContext {
130-
return item.context
130+
return item.context
131131
}
132132

133133
func (item *MetricTelemetry) baseTypeName() string {
@@ -140,7 +140,7 @@ func (item *MetricTelemetry) baseData() Domain {
140140

141141
type RequestTelemetry struct {
142142
BaseTelemetry
143-
data *requestData
143+
data *requestData
144144
}
145145

146146
func NewRequestTelemetry(name string, timestamp time.Time, duration time.Duration, responseCode string, success bool) *RequestTelemetry {
@@ -156,21 +156,21 @@ func NewRequestTelemetry(name string, timestamp time.Time, duration time.Duratio
156156
data.Ver = 2
157157

158158
item := &RequestTelemetry{
159-
data: data,
159+
data: data,
160160
}
161-
162-
item.timestamp = now
163-
item.context = &telemetryContext{}
164-
165-
return item
161+
162+
item.timestamp = now
163+
item.context = NewItemTelemetryContext()
164+
165+
return item
166166
}
167167

168168
func (item *RequestTelemetry) Timestamp() time.Time {
169169
return item.timestamp
170170
}
171171

172172
func (item *RequestTelemetry) Context() TelemetryContext {
173-
return item.context
173+
return item.context
174174
}
175175

176176
func (item *RequestTelemetry) baseTypeName() string {

appinsights/diagnostics.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package appinsights
2+
3+
type DiagnosticsMessageWriter interface {
4+
Write(string)
5+
appendListener(*diagnosticsMessageListener)
6+
}
7+
8+
type diagnosticsMessageWriter struct {
9+
listeners []chan string
10+
}
11+
12+
type DiagnosticsMessageProcessor func(string)
13+
14+
type DiagnosticsMessageListener interface {
15+
ProcessMessages(DiagnosticsMessageProcessor)
16+
}
17+
18+
type diagnosticsMessageListener struct {
19+
channel chan string
20+
}
21+
22+
var writer *diagnosticsMessageWriter = &diagnosticsMessageWriter{
23+
listeners: make([]chan string, 0),
24+
}
25+
26+
func getDiagnosticsMessageWriter() DiagnosticsMessageWriter {
27+
return writer
28+
}
29+
30+
func NewDiagnosticsMessageListener() DiagnosticsMessageListener {
31+
listener := &diagnosticsMessageListener {
32+
channel: make(chan string),
33+
}
34+
35+
writer.appendListener(listener)
36+
37+
return listener
38+
}
39+
40+
func (writer *diagnosticsMessageWriter) appendListener(listener *diagnosticsMessageListener) {
41+
writer.listeners = append(writer.listeners, listener.channel)
42+
}
43+
44+
func (writer *diagnosticsMessageWriter) Write(message string) {
45+
for _, c := range writer.listeners {
46+
c <- message
47+
}
48+
}
49+
50+
func (listener *diagnosticsMessageListener) ProcessMessages(process DiagnosticsMessageProcessor) {
51+
for {
52+
message := <- listener.channel
53+
process(message)
54+
}
55+
}

appinsights/diagnostics_test.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package appinsights
2+
3+
import "testing"
4+
import "sync"
5+
6+
func TestDiagnosticsWriterIsSingleton(t *testing.T) {
7+
diagWriter1 := getDiagnosticsMessageWriter()
8+
diagWriter2 := getDiagnosticsMessageWriter()
9+
10+
if diagWriter1 != diagWriter2 {
11+
t.Errorf("getDiagnosticsMessageWriter() returned difference instances.")
12+
}
13+
}
14+
15+
func TestMessageSentToConsumers(t *testing.T) {
16+
diagWriter := getDiagnosticsMessageWriter()
17+
18+
original := "test"
19+
20+
var wg sync.WaitGroup
21+
wg.Add(2)
22+
23+
listener1 := NewDiagnosticsMessageListener()
24+
go listener1.ProcessMessages(func(message string) {
25+
if message != original {
26+
t.Errorf("listener1 returned difference messages, want '%s' got '%s'.", original, message)
27+
}
28+
wg.Done()
29+
})
30+
31+
listener2 := NewDiagnosticsMessageListener()
32+
go listener2.ProcessMessages(func(message string) {
33+
if message != original {
34+
t.Errorf("listener2 returned difference messages, want '%s' got '%s'.", original, message)
35+
}
36+
wg.Done()
37+
})
38+
39+
diagWriter.Write(original)
40+
41+
wg.Wait()
42+
}

0 commit comments

Comments
 (0)