@@ -3,14 +3,15 @@ package graphite
3
3
import (
4
4
"errors"
5
5
"fmt"
6
- "github.com/influxdata/telegraf"
7
- "github.com/influxdata/telegraf/plugins/outputs"
8
6
"log"
9
7
"math/rand"
10
8
"net"
11
- "sort"
12
9
"strings"
13
10
"time"
11
+
12
+ "github.com/influxdata/telegraf"
13
+ "github.com/influxdata/telegraf/plugins/outputs"
14
+ "github.com/influxdata/telegraf/plugins/serializers"
14
15
)
15
16
16
17
type Graphite struct {
@@ -71,42 +72,22 @@ func (g *Graphite) Description() string {
71
72
func (g * Graphite ) Write (metrics []telegraf.Metric ) error {
72
73
// Prepare data
73
74
var bp []string
74
- for _ , metric := range metrics {
75
- // Get name
76
- name := metric .Name ()
77
- // Convert UnixNano to Unix timestamps
78
- timestamp := metric .UnixNano () / 1000000000
79
- tag_str := buildTags (metric )
75
+ s , err := serializers .NewGraphiteSerializer (g .Prefix )
76
+ if err != nil {
77
+ return err
78
+ }
80
79
81
- for field_name , value := range metric .Fields () {
82
- // Convert value
83
- value_str := fmt .Sprintf ("%#v" , value )
84
- // Write graphite metric
85
- var graphitePoint string
86
- if name == field_name {
87
- graphitePoint = fmt .Sprintf ("%s.%s %s %d\n " ,
88
- tag_str ,
89
- strings .Replace (name , "." , "_" , - 1 ),
90
- value_str ,
91
- timestamp )
92
- } else {
93
- graphitePoint = fmt .Sprintf ("%s.%s.%s %s %d\n " ,
94
- tag_str ,
95
- strings .Replace (name , "." , "_" , - 1 ),
96
- strings .Replace (field_name , "." , "_" , - 1 ),
97
- value_str ,
98
- timestamp )
99
- }
100
- if g .Prefix != "" {
101
- graphitePoint = fmt .Sprintf ("%s.%s" , g .Prefix , graphitePoint )
102
- }
103
- bp = append (bp , graphitePoint )
80
+ for _ , metric := range metrics {
81
+ gMetrics , err := s .Serialize (metric )
82
+ if err != nil {
83
+ log .Printf ("Error serializing some metrics to graphite: %s" , err .Error ())
104
84
}
85
+ bp = append (bp , gMetrics ... )
105
86
}
106
- graphitePoints := strings .Join (bp , "" )
87
+ graphitePoints := strings .Join (bp , "\n " ) + " \n "
107
88
108
89
// This will get set to nil if a successful write occurs
109
- err : = errors .New ("Could not write to any Graphite server in cluster\n " )
90
+ err = errors .New ("Could not write to any Graphite server in cluster\n " )
110
91
111
92
// Send data to a random server
112
93
p := rand .Perm (len (g .conns ))
@@ -128,37 +109,6 @@ func (g *Graphite) Write(metrics []telegraf.Metric) error {
128
109
return err
129
110
}
130
111
131
- func buildTags (metric telegraf.Metric ) string {
132
- var keys []string
133
- tags := metric .Tags ()
134
- for k := range tags {
135
- if k == "host" {
136
- continue
137
- }
138
- keys = append (keys , k )
139
- }
140
- sort .Strings (keys )
141
-
142
- var tag_str string
143
- if host , ok := tags ["host" ]; ok {
144
- if len (keys ) > 0 {
145
- tag_str = strings .Replace (host , "." , "_" , - 1 ) + "."
146
- } else {
147
- tag_str = strings .Replace (host , "." , "_" , - 1 )
148
- }
149
- }
150
-
151
- for i , k := range keys {
152
- tag_value := strings .Replace (tags [k ], "." , "_" , - 1 )
153
- if i == 0 {
154
- tag_str += tag_value
155
- } else {
156
- tag_str += "." + tag_value
157
- }
158
- }
159
- return tag_str
160
- }
161
-
162
112
func init () {
163
113
outputs .Add ("graphite" , func () telegraf.Output {
164
114
return & Graphite {}
0 commit comments