// ListMetricTimelines returns a list of metric timelines func ListServiceTimelines(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("List Service Timelines") err := error(nil) charset := "utf-8" //STANDARD DECLARATIONS END // Set Content-Type response Header value contentType := r.Header.Get("Accept") h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) // Parse the request into the input urlValues := r.URL.Query() vars := mux.Vars(r) parsedStart, _ := parseZuluDate(urlValues.Get("start_time")) parsedEnd, _ := parseZuluDate(urlValues.Get("end_time")) input := InputParams{ parsedStart, parsedEnd, vars["report_name"], vars["group_type"], vars["group_name"], vars["service_name"], contentType, } // Grab Tenant DB configuration from context tenantDbConfig := context.Get(r, "tenant_conf").(config.MongoConfig) // Mongo Session results := []DataOutput{} session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) metricCollection := session.DB(tenantDbConfig.Db).C("status_services") // Query the detailed metric results reportID, err := mongo.GetReportID(session, tenantDbConfig.Db, input.report) if err != nil { code = http.StatusInternalServerError return code, h, output, err } err = metricCollection.Find(prepareQuery(input, reportID)).All(&results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } output, err = createView(results, input) //Render the results into XML format h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }
// ListMetricTimelines returns a list of metric timelines func ListMetricTimelines(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("List Metric Timelines") err := error(nil) contentType := "application/xml" charset := "utf-8" //STANDARD DECLARATIONS END contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } // Parse the request into the input urlValues := r.URL.Query() vars := mux.Vars(r) parsedStart, parsedEnd, errs := respond.ValidateDateRange(urlValues.Get("start_time"), urlValues.Get("end_time")) if len(errs) > 0 { code = http.StatusBadRequest output = respond.CreateFailureResponseMessage("Bad Request", "400", errs).MarshalTo(contentType) } input := InputParams{ parsedStart, parsedEnd, vars["report_name"], vars["group_type"], vars["group_name"], vars["service_name"], vars["endpoint_name"], vars["metric_name"], contentType, } // Call authenticateTenant to check the api key and retrieve // the correct tenant db conf tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output = []byte(http.StatusText(http.StatusUnauthorized)) code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } // Mongo Session results := []DataOutput{} session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) metricCollection := session.DB(tenantDbConfig.Db).C("status_metrics") // Query the detailed metric results reportID, err := mongo.GetReportID(session, tenantDbConfig.Db, input.report) if err != nil { code = http.StatusInternalServerError return code, h, output, err } err = metricCollection.Find(prepareQuery(input, reportID)).All(&results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } output, err = createView(results, input) //Render the results into XML format h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }