Skip to content
This repository has been archived by the owner on Dec 23, 2023. It is now read-only.

Fix the api name sent to SD stats exporter. #827

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ final class StackdriverExportUtils {
// TODO(songya): do we want these constants to be customizable?
@VisibleForTesting static final String LABEL_DESCRIPTION = "OpenCensus TagKey";

private static final String CUSTOM_METRIC_DOMAIN = "custom.googleapis.com";
private static final String CUSTOM_OPENCENSUS_DOMAIN = CUSTOM_METRIC_DOMAIN + "/opencensus/";

// Construct a MetricDescriptor using a View.
@Nullable
static MetricDescriptor createMetricDescriptor(View view, String projectId) {
Expand All @@ -77,10 +80,11 @@ static MetricDescriptor createMetricDescriptor(View view, String projectId) {

MetricDescriptor.Builder builder = MetricDescriptor.newBuilder();
String viewName = view.getName().asString();
String type = generateType(viewName);
// Name format refers to
// cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.metricDescriptors/create
builder.setName(String.format("projects/%s", projectId));
builder.setType(String.format("custom.googleapis.com/opencensus/%s", viewName));
builder.setName(String.format("projects/%s/metricDescriptors/%s", projectId, type));
builder.setType(type);
builder.setDescription(view.getDescription());
builder.setUnit(view.getMeasure().getUnit());
builder.setDisplayName("OpenCensus/" + viewName);
Expand All @@ -92,6 +96,10 @@ static MetricDescriptor createMetricDescriptor(View view, String projectId) {
return builder.build();
}

private static String generateType(String viewName) {
return CUSTOM_OPENCENSUS_DOMAIN + viewName;
}

// Construct a LabelDescriptor from a TagKey
@VisibleForTesting
static LabelDescriptor createLabelDescriptor(TagKey tagKey) {
Expand Down Expand Up @@ -162,8 +170,7 @@ static List<TimeSeries> createTimeSeriesList(ViewData viewData, String projectId
static Metric createMetric(View view, List<? extends TagValue> tagValues) {
Metric.Builder builder = Metric.newBuilder();
// TODO(songya): use pre-defined metrics for canonical views
builder.setType(
String.format("custom.googleapis.com/opencensus/%s", view.getName().asString()));
builder.setType(generateType(view.getName().asString()));
Map<String, String> stringTagMap = Maps.newHashMap();
List<TagKey> columns = view.getColumns();
checkArgument(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.google.common.collect.Lists;
import com.google.monitoring.v3.CreateMetricDescriptorRequest;
import com.google.monitoring.v3.CreateTimeSeriesRequest;
import com.google.monitoring.v3.ProjectName;
import io.opencensus.common.Duration;
import io.opencensus.stats.View;
import io.opencensus.stats.ViewData;
Expand Down Expand Up @@ -49,6 +50,7 @@ final class StackdriverExporterWorkerThread extends Thread {

private final long scheduleDelayMillis;
private final String projectId;
private final ProjectName projectName;
private final MetricServiceClient metricServiceClient;
private final ViewManager viewManager;
private final Map<View.Name, View> registeredViews = new HashMap<View.Name, View>();
Expand All @@ -60,6 +62,7 @@ final class StackdriverExporterWorkerThread extends Thread {
ViewManager viewManager) {
this.scheduleDelayMillis = toMillis(exportInterval);
this.projectId = projectId;
projectName = ProjectName.newBuilder().setProject(projectId).build();
this.metricServiceClient = metricServiceClient;
this.viewManager = viewManager;
setDaemon(true);
Expand Down Expand Up @@ -94,7 +97,10 @@ void registerView(View view) {
StackdriverExportUtils.createMetricDescriptor(view, projectId);
if (metricDescriptor != null) {
metricServiceClient.createMetricDescriptor(
CreateMetricDescriptorRequest.newBuilder().setMetricDescriptor(metricDescriptor).build());
CreateMetricDescriptorRequest.newBuilder()
.setNameWithProjectName(projectName)
.setMetricDescriptor(metricDescriptor)
.build());
}
}

Expand All @@ -107,7 +113,8 @@ void export() {
registerView(view);
viewDataList.add(viewManager.getView(view.getName()));
}
CreateTimeSeriesRequest.Builder builder = CreateTimeSeriesRequest.newBuilder();
CreateTimeSeriesRequest.Builder builder =
CreateTimeSeriesRequest.newBuilder().setNameWithProjectName(projectName);
for (ViewData viewData : viewDataList) {
builder.addAllTimeSeries(StackdriverExportUtils.createTimeSeriesList(viewData, projectId));
}
Expand All @@ -126,6 +133,8 @@ public void run() {
// Preserve the interruption status as per guidance and stop doing any work.
Thread.currentThread().interrupt();
return;
} catch (Throwable e) {
logger.log(Level.WARNING, "Exception thrown by the Stackdriver stats exporter.", e);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,12 @@ public void createMetricDescriptor_cumulative() {
CUMULATIVE);
MetricDescriptor metricDescriptor =
StackdriverExportUtils.createMetricDescriptor(view, PROJECT_ID);
assertThat(metricDescriptor.getName()).isEqualTo("projects/" + PROJECT_ID);
assertThat(metricDescriptor.getName())
.isEqualTo(
"projects/"
+ PROJECT_ID
+ "/metricDescriptors/custom.googleapis.com/opencensus/"
+ VIEW_NAME);
assertThat(metricDescriptor.getDescription()).isEqualTo(VIEW_DESCRIPTION);
assertThat(metricDescriptor.getDisplayName()).isEqualTo("OpenCensus/" + VIEW_NAME);
assertThat(metricDescriptor.getType())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,18 @@ public void export() throws IOException {
List<TimeSeries> timeSeries = StackdriverExportUtils.createTimeSeriesList(viewData, PROJECT_ID);
verify(mockCreateMetricDescriptorCallable, times(1))
.call(
eq(CreateMetricDescriptorRequest.newBuilder().setMetricDescriptor(descriptor).build()));
eq(
CreateMetricDescriptorRequest.newBuilder()
.setName("projects/" + PROJECT_ID)
.setMetricDescriptor(descriptor)
.build()));
verify(mockCreateTimeSeriesCallable, times(1))
.call(eq(CreateTimeSeriesRequest.newBuilder().addAllTimeSeries(timeSeries).build()));
.call(
eq(
CreateTimeSeriesRequest.newBuilder()
.setName("projects/" + PROJECT_ID)
.addAllTimeSeries(timeSeries)
.build()));
}

@Test
Expand Down