Skip to content

Commit cf98aa5

Browse files
committed
feat(tags): return fetch error
1 parent af84f05 commit cf98aa5

File tree

5 files changed

+146
-17
lines changed

5 files changed

+146
-17
lines changed

cmd/carbonapi/http/tags_handler.go

+6-9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/go-graphite/carbonapi/carbonapipb"
1414
"github.com/go-graphite/carbonapi/cmd/carbonapi/config"
1515
utilctx "github.com/go-graphite/carbonapi/util/ctx"
16+
"github.com/go-graphite/carbonapi/zipper/helper"
1617
"github.com/go-graphite/carbonapi/zipper/types"
1718
"github.com/lomik/zapwriter"
1819
"go.uber.org/zap"
@@ -58,8 +59,7 @@ func tagHandler(w http.ResponseWriter, r *http.Request) {
5859
err := r.ParseForm()
5960
if err != nil {
6061
logAsError = true
61-
w.Header().Set("Content-Type", contentTypeJSON)
62-
_, _ = w.Write([]byte{'[', ']'})
62+
setError(w, accessLogDetails, err.Error(), http.StatusBadRequest, carbonapiUUID)
6363
return
6464
}
6565

@@ -100,10 +100,9 @@ func tagHandler(w http.ResponseWriter, r *http.Request) {
100100
}
101101

102102
// TODO(civil): Implement stats
103-
if err != nil && !merry.Is(err, types.ErrNoMetricsFetched) && !merry.Is(err, types.ErrNonFatalErrors) {
104-
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
105-
accessLogDetails.HTTPCode = http.StatusInternalServerError
106-
accessLogDetails.Reason = err.Error()
103+
if err != nil && !merry.Is(err, types.ErrNoMetricsFetched) && (!merry.Is(err, types.ErrNonFatalErrors) || config.Config.Upstreams.RequireSuccessAll) {
104+
code := merry.HTTPCode(err)
105+
setError(w, accessLogDetails, helper.MerryRootError(err), code, carbonapiUUID)
107106
logAsError = true
108107
return
109108
}
@@ -116,9 +115,7 @@ func tagHandler(w http.ResponseWriter, r *http.Request) {
116115
}
117116

118117
if err != nil {
119-
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
120-
accessLogDetails.HTTPCode = http.StatusInternalServerError
121-
accessLogDetails.Reason = err.Error()
118+
setError(w, accessLogDetails, err.Error(), http.StatusInternalServerError, carbonapiUUID)
122119
logAsError = true
123120
return
124121
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
listen: "localhost:8081"
2+
expvar:
3+
enabled: true
4+
pprofEnabled: false
5+
listen: ""
6+
concurency: 1000
7+
notFoundStatusCode: 200
8+
cache:
9+
type: "mem"
10+
size_mb: 0
11+
defaultTimeoutSec: 60
12+
cpus: 0
13+
tz: ""
14+
maxBatchSize: 0
15+
graphite:
16+
host: ""
17+
interval: "60s"
18+
prefix: "carbon.api"
19+
pattern: "{prefix}.{fqdn}"
20+
idleConnections: 10
21+
pidFile: ""
22+
upstreams:
23+
buckets: 10
24+
timeouts:
25+
find: "2s"
26+
render: "10s"
27+
connect: "200ms"
28+
concurrencyLimitPerServer: 0
29+
keepAliveInterval: "30s"
30+
maxIdleConnsPerHost: 100
31+
requireSuccessAll: true
32+
backendsv2:
33+
backends:
34+
-
35+
groupName: "mock-001"
36+
protocol: "auto"
37+
lbMethod: "all"
38+
maxTries: 3
39+
maxBatchSize: 0
40+
keepAliveInterval: "10s"
41+
concurrencyLimit: 0
42+
forceAttemptHTTP2: true
43+
maxIdleConnsPerHost: 1000
44+
timeouts:
45+
find: "15000s"
46+
render: "5000s"
47+
connect: "200ms"
48+
servers:
49+
- "http://127.0.0.1:9070"
50+
graphite09compat: false
51+
expireDelaySec: 10
52+
logger:
53+
- logger: ""
54+
file: "stderr"
55+
level: "debug"
56+
encoding: "console"
57+
encodingTime: "iso8601"
58+
encodingDuration: "seconds"

cmd/mockbackend/testcases/tags_error/tags_error.yaml

-5
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,6 @@ test:
4848
contentType: "application/json"
4949
expectedResults:
5050
- tagsAutocompelete: []
51-
# TODO: error check
52-
# httpCode: 503
53-
# contentType: "text/plain; charset=utf-8"
5451

5552
# 503
5653
- endpoint: "http://127.0.0.1:8081"
@@ -61,8 +58,6 @@ test:
6158
contentType: "application/json"
6259
expectedResults:
6360
- tagsAutocompelete: []
64-
# httpCode: 503
65-
# contentType: "text/plain; charset=utf-8"
6661

6762
listeners:
6863
- address: ":9070"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
version: "v1"
2+
test:
3+
apps:
4+
- name: "carbonapi"
5+
binary: "./carbonapi"
6+
args:
7+
- "-config"
8+
- "./cmd/mockbackend/carbonapi_singlebackend_all.yaml"
9+
- "-exact-config"
10+
queries:
11+
- endpoint: "http://127.0.0.1:8081"
12+
type: "GET"
13+
URL: "/tags/autoComplete/values?expr=tag1%3Dv1&tag=tag2"
14+
expectedResponse:
15+
httpCode: 200
16+
contentType: "application/json"
17+
expectedResults:
18+
- tagsAutocompelete:
19+
- "value1"
20+
- "value2"
21+
22+
- endpoint: "http://127.0.0.1:8081"
23+
type: "GET"
24+
URL: "/tags/autoComplete/tags?expr=tag1%3Dv1&tagPrefix=tag"
25+
expectedResponse:
26+
httpCode: 200
27+
contentType: "application/json"
28+
expectedResults:
29+
- tagsAutocompelete:
30+
- "tag2"
31+
32+
# empty
33+
- endpoint: "http://127.0.0.1:8081"
34+
type: "GET"
35+
URL: "/tags/autoComplete/values?expr=tag1%3Dv1&tag=tag3"
36+
expectedResponse:
37+
httpCode: 200
38+
contentType: "application/json"
39+
expectedResults:
40+
- tagsAutocompelete: []
41+
42+
# timeout
43+
- endpoint: "http://127.0.0.1:8081"
44+
type: "GET"
45+
URL: "/tags/autoComplete/values?expr=tag2%3Dv1&tag=tag3"
46+
expectedResponse:
47+
httpCode: 503
48+
contentType: "text/plain; charset=utf-8"
49+
errBody: "timeout while fetching Response\n"
50+
51+
# 503
52+
- endpoint: "http://127.0.0.1:8081"
53+
type: "GET"
54+
URL: "/tags/autoComplete/values?expr=tag2%3Dv1&tag=tag4"
55+
expectedResponse:
56+
httpCode: 503
57+
contentType: "text/plain; charset=utf-8"
58+
errBody: "Service Unavailable\n"
59+
60+
listeners:
61+
- address: ":9070"
62+
expressions:
63+
"/tags/autoComplete/values?expr=tag1%3Dv1&tag=tag2":
64+
tags:
65+
- "value1"
66+
- "value2"
67+
68+
"/tags/autoComplete/tags?expr=tag1%3Dv1&tagPrefix=tag":
69+
tags:
70+
- "tag2"
71+
72+
"/tags/autoComplete/values?expr=tag2%3Dv1&tag=tag3":
73+
replyDelayMS: 7000
74+
tags:
75+
- "value3"
76+
- "value4"
77+
78+
"/tags/autoComplete/values?expr=tag2%3Dv1&tag=tag4":
79+
code: 503

zipper/broadcast/broadcast_group.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -846,9 +846,9 @@ func (bg *BroadcastGroup) tagEverything(ctx context.Context, isTagName bool, que
846846

847847
var err merry.Error
848848
if result.Err != nil {
849-
err = types.ErrNonFatalErrors
850-
for _, e := range result.Err {
851-
err = err.WithCause(e)
849+
code, errors := helper.MergeHttpErrors(result.Err)
850+
if len(errors) > 0 {
851+
err = types.ErrNonFatalErrors.WithHTTPCode(code).WithMessage(strings.Join(errors, "\n"))
852852
}
853853
}
854854

0 commit comments

Comments
 (0)