1
1
package main
2
2
3
3
import (
4
+ "errors"
4
5
"flag"
5
6
"fmt"
6
7
"net/http"
7
8
"os"
9
+ "strconv"
8
10
"strings"
9
11
"time"
10
12
@@ -27,7 +29,8 @@ import (
27
29
var (
28
30
confFile = flag .String ("config" , "/etc/metrictank/metrictank.ini" , "configuration file path" )
29
31
exitOnError = flag .Bool ("exit-on-error" , false , "Exit with a message when there's an error" )
30
- httpEndpoint = flag .String ("http-endpoint" , "127.0.0.1:8080" , "The http endpoint to listen on" )
32
+ listenAddress = flag .String ("listen-address" , "127.0.0.1" , "The address to listen on" )
33
+ listenPort = flag .Int ("listen-port" , 8080 , "The port to listen on" )
31
34
ttlsStr = flag .String ("ttls" , "35d" , "list of ttl strings used by MT separated by ','" )
32
35
partitionScheme = flag .String ("partition-scheme" , "bySeries" , "method used for partitioning metrics. This should match the settings of tsdb-gw. (byOrg|bySeries)" )
33
36
uriPath = flag .String ("uri-path" , "/chunks" , "the URI on which we expect chunks to get posted" )
@@ -137,21 +140,22 @@ func main() {
137
140
138
141
index .Init ()
139
142
143
+ httpEndpoint := fmt .Sprintf ("%s:%d" , * listenAddress , * listenPort )
140
144
server := & Server {
141
145
partitioner : p ,
142
146
index : index ,
143
147
store : store ,
144
148
HTTPServer : & http.Server {
145
- Addr : * httpEndpoint ,
149
+ Addr : httpEndpoint ,
146
150
ReadTimeout : 10 * time .Minute ,
147
151
},
148
152
}
149
153
150
154
http .HandleFunc (* uriPath , server .chunksHandler )
151
155
http .HandleFunc ("/healthz" , server .healthzHandler )
152
156
153
- log .Infof ("Listening on %q" , * httpEndpoint )
154
- err = http .ListenAndServe (* httpEndpoint , nil )
157
+ log .Infof ("Listening on %q" , httpEndpoint )
158
+ err = http .ListenAndServe (httpEndpoint , nil )
155
159
if err != nil {
156
160
panic (fmt .Sprintf ("Error creating listener: %q" , err ))
157
161
}
@@ -173,8 +177,15 @@ func (s *Server) healthzHandler(w http.ResponseWriter, req *http.Request) {
173
177
}
174
178
175
179
func (s * Server ) chunksHandler (w http.ResponseWriter , req * http.Request ) {
180
+ orgId , err := getOrgId (req )
181
+ if err != nil {
182
+ w .WriteHeader (http .StatusForbidden )
183
+ w .Write ([]byte (err .Error ()))
184
+ return
185
+ }
186
+
176
187
data := mdata.ArchiveRequest {}
177
- err : = data .UnmarshalCompressed (req .Body )
188
+ err = data .UnmarshalCompressed (req .Body )
178
189
if err != nil {
179
190
throwError (w , fmt .Sprintf ("Error decoding cwr stream: %q" , err ))
180
191
return
@@ -189,13 +200,15 @@ func (s *Server) chunksHandler(w http.ResponseWriter, req *http.Request) {
189
200
"Received %d cwrs for metric %s. The first has Key: %s, T0: %d, TTL: %d. The last has Key: %s, T0: %d, TTL: %d" ,
190
201
len (data .ChunkWriteRequests ),
191
202
data .MetricData .Name ,
192
- data .ChunkWriteRequests [0 ].Key .String (),
203
+ data .ChunkWriteRequests [0 ].Archive .String (),
193
204
data .ChunkWriteRequests [0 ].T0 ,
194
205
data .ChunkWriteRequests [0 ].TTL ,
195
- data .ChunkWriteRequests [len (data .ChunkWriteRequests )- 1 ].Key .String (),
206
+ data .ChunkWriteRequests [len (data .ChunkWriteRequests )- 1 ].Archive .String (),
196
207
data .ChunkWriteRequests [len (data .ChunkWriteRequests )- 1 ].T0 ,
197
208
data .ChunkWriteRequests [len (data .ChunkWriteRequests )- 1 ].TTL )
198
209
210
+ data .MetricData .OrgId = orgId
211
+ data .MetricData .SetId ()
199
212
partition , err := s .partitioner .Partition (& data .MetricData , int32 (* numPartitions ))
200
213
if err != nil {
201
214
throwError (w , fmt .Sprintf ("Error partitioning: %q" , err ))
@@ -210,7 +223,18 @@ func (s *Server) chunksHandler(w http.ResponseWriter, req *http.Request) {
210
223
211
224
s .index .AddOrUpdate (mkey , & data .MetricData , partition )
212
225
for _ , cwr := range data .ChunkWriteRequests {
213
- cwr := cwr // important because we pass by reference and this var will get overwritten in the next loop
214
- s .store .Add (& cwr )
226
+ cwrWithOrg := cwr .GetChunkWriteRequest (nil , mkey )
227
+ s .store .Add (& cwrWithOrg )
228
+ }
229
+ }
230
+
231
+ func getOrgId (req * http.Request ) (int , error ) {
232
+ if orgIdStr := req .Header .Get ("X-Org-Id" ); len (orgIdStr ) > 0 {
233
+ if orgId , err := strconv .Atoi (orgIdStr ); err == nil {
234
+ return orgId , nil
235
+ } else {
236
+ return 0 , fmt .Errorf ("Invalid value in X-Org-Id header (%s): %s" , orgIdStr , err )
237
+ }
215
238
}
239
+ return 0 , errors .New ("Missing X-Org-Id header" )
216
240
}
0 commit comments