in internal/oraclemetrics/oraclemetrics.go [353:394]
func executeQueryAndSendMetrics(ctx context.Context, opts queryOptions) []*mrpb.TimeSeries {
queryName := opts.query.GetName()
ctxTimeout, cancel := context.WithTimeout(ctx, time.Second*time.Duration(opts.timeout))
defer cancel()
cols := createColumns(opts.query.GetColumns())
if cols == nil {
log.CtxLogger(ctx).Errorw("No columns specified for query", "query_name", queryName)
opts.collector.failCount[fmt.Sprintf("%s:%s", opts.serviceName, queryName)]++
return nil
}
// TODO: Evaluate adding a backoff mechanism for retrying database queries.
rows, err := opts.db.QueryContext(ctxTimeout, opts.query.GetSql())
if err != nil {
log.CtxLogger(ctx).Errorw("Failed to execute query", "query_name", queryName, "error", err)
opts.collector.failCount[fmt.Sprintf("%s:%s", opts.serviceName, queryName)]++
return nil
}
var ts []*mrpb.TimeSeries
for rows.Next() {
if err := rows.Scan(cols...); err != nil {
log.CtxLogger(ctx).Errorw("Failed to scan row", "query_name", queryName, "error", err)
opts.collector.failCount[fmt.Sprintf("%s:%s", opts.serviceName, queryName)]++
return nil
}
ts = append(ts, createMetricsForRow(ctx, opts, cols, opts.defaultLabels)...)
}
sent, batchCount, err := cloudmonitoring.SendTimeSeries(ctxTimeout, ts, opts.collector.TimeSeriesCreator, opts.collector.BackOffs, opts.collector.Config.GetCloudProperties().GetProjectId())
if err != nil {
opts.collector.failCount[fmt.Sprintf("%s:%s", opts.serviceName, queryName)]++
failCount := opts.collector.failCount[fmt.Sprintf("%s:%s", opts.serviceName, queryName)]
log.CtxLogger(ctx).Errorw("Failed to query database and send metrics to Cloud Monitoring", "query_name", queryName, "service_name", opts.serviceName, "fail_count", failCount, "error", err)
usagemetrics.Error(usagemetrics.OracleMetricCollectionFailure)
return nil
}
delete(opts.collector.failCount, fmt.Sprintf("%s:%s", opts.serviceName, queryName))
log.CtxLogger(ctx).Debugw("Successfully queried database and sent metrics to Cloud Monitoring", "query_name", queryName, "service_name", opts.serviceName, "sent", sent, "batches", batchCount)
return ts
}