func executeQueryAndSendMetrics()

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
}