internal/tracecontexttest/main.go (57 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package main // This program is a test service for the W3C Distributed Tracing test harness: // https://github.com/w3c/trace-context/tree/master/test import ( "bytes" "encoding/json" "flag" "log" "net/http" "go.elastic.co/apm/module/apmhttp/v2" ) var ( listenAddr = flag.String("listen", ":5000", "Address to listen on for test requests") ) func main() { flag.Parse() type TestCase struct { URL string `json:"url"` Args []json.RawMessage `json:"arguments,omitempty"` } client := http.DefaultClient client = apmhttp.WrapClient(client) var handler http.HandlerFunc = func(w http.ResponseWriter, req *http.Request) { var testCases []TestCase if err := json.NewDecoder(req.Body).Decode(&testCases); err != nil { log.Printf("decoding error: %s", err) http.Error(w, err.Error(), http.StatusBadRequest) return } for _, tc := range testCases { var buf bytes.Buffer if err := json.NewEncoder(&buf).Encode(tc.Args); err != nil { log.Printf("encoding error: %s", err) http.Error(w, err.Error(), http.StatusBadRequest) return } outReq, err := http.NewRequest("POST", tc.URL, &buf) if err != nil { log.Printf("error creating request: %s", err) http.Error(w, err.Error(), http.StatusInternalServerError) continue } outReq = outReq.WithContext(req.Context()) outReq.Header.Set("Content-Type", "application/json") resp, err := client.Do(outReq) if err != nil { log.Printf("error sending request: %s", err) http.Error(w, err.Error(), http.StatusInternalServerError) continue } resp.Body.Close() if resp.StatusCode != http.StatusOK { log.Printf("status: %s", resp.Status) } } } log.Printf("Starting Trace-Context test service, listening on %s", *listenAddr) log.Fatal(http.ListenAndServe(*listenAddr, apmhttp.Wrap(handler))) }