diff --git a/exporter/awsemfexporter/README.md b/exporter/awsemfexporter/README.md index d616eae1fa64..f1964c135aba 100644 --- a/exporter/awsemfexporter/README.md +++ b/exporter/awsemfexporter/README.md @@ -1,10 +1,15 @@ # AWS CloudWatch EMF Exporter for OpenTelemetry Collector -| Status | | -| ------------------------ |-----------| -| Stability | [beta] | -| Supported pipeline types | metrics | -| Distributions | [contrib] | + +| Status | | +| ------------- |-----------| +| Stability | [beta]: metrics | +| Distributions | [contrib], [aws] | + +[beta]: https://github.com/open-telemetry/opentelemetry-collector#beta +[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib +[aws]: https://github.com/aws-observability/aws-otel-collector + This exporter converts OpenTelemetry metrics to [AWS CloudWatch Embedded Metric Format(EMF)](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Specification.html) @@ -110,6 +115,3 @@ exporters: metric_name_selectors: - "^node_filesystem_readonly$" ``` - -[beta]:https://github.com/open-telemetry/opentelemetry-collector#beta -[contrib]:https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib diff --git a/exporter/awsemfexporter/config_test.go b/exporter/awsemfexporter/config_test.go index ddb8d9ff11c5..e60ab4910f0f 100644 --- a/exporter/awsemfexporter/config_test.go +++ b/exporter/awsemfexporter/config_test.go @@ -26,6 +26,7 @@ import ( "go.opentelemetry.io/collector/confmap/confmaptest" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry" ) @@ -41,11 +42,11 @@ func TestLoadConfig(t *testing.T) { expected component.Config }{ { - id: component.NewIDWithName(typeStr, ""), + id: component.NewIDWithName(metadata.Type, ""), expected: createDefaultConfig(), }, { - id: component.NewIDWithName(typeStr, "1"), + id: component.NewIDWithName(metadata.Type, "1"), expected: &Config{ AWSSessionSettings: awsutil.AWSSessionSettings{ NumberOfWorkers: 8, @@ -66,7 +67,7 @@ func TestLoadConfig(t *testing.T) { }, }, { - id: component.NewIDWithName(typeStr, "resource_attr_to_label"), + id: component.NewIDWithName(metadata.Type, "resource_attr_to_label"), expected: &Config{ AWSSessionSettings: awsutil.AWSSessionSettings{ NumberOfWorkers: 8, @@ -88,7 +89,7 @@ func TestLoadConfig(t *testing.T) { }, }, { - id: component.NewIDWithName(typeStr, "metric_descriptors"), + id: component.NewIDWithName(metadata.Type, "metric_descriptors"), expected: &Config{ AWSSessionSettings: awsutil.AWSSessionSettings{ NumberOfWorkers: 8, @@ -206,46 +207,46 @@ func TestValidateTags(t *testing.T) { errorMessage string }{ { - id: component.NewIDWithName(typeStr, "validate-correct"), + id: component.NewIDWithName(metadata.Type, "validate-correct"), tags: map[string]*string{"basicKey": &basicValue}, }, { - id: component.NewIDWithName(typeStr, "too-little-tags"), + id: component.NewIDWithName(metadata.Type, "too-little-tags"), tags: emptyMap, errorMessage: "invalid amount of items. Please input at least 1 tag or remove the tag field", }, { - id: component.NewIDWithName(typeStr, "too-many-tags"), + id: component.NewIDWithName(metadata.Type, "too-many-tags"), tags: bigMap, errorMessage: "invalid amount of items. Please input at most 50 tags", }, { - id: component.NewIDWithName(typeStr, "wrong-key-regex"), + id: component.NewIDWithName(metadata.Type, "wrong-key-regex"), tags: map[string]*string{"***": &basicValue}, errorMessage: "key - *** does not follow the regex pattern" + `^([\p{L}\p{Z}\p{N}_.:/=+\-@]+)$`, }, { - id: component.NewIDWithName(typeStr, "wrong-value-regex"), + id: component.NewIDWithName(metadata.Type, "wrong-value-regex"), tags: map[string]*string{"basicKey": &wrongRegexValue}, errorMessage: "value - " + wrongRegexValue + " does not follow the regex pattern" + `^([\p{L}\p{Z}\p{N}_.:/=+\-@]*)$`, }, { - id: component.NewIDWithName(typeStr, "key-too-short"), + id: component.NewIDWithName(metadata.Type, "key-too-short"), tags: map[string]*string{"": &basicValue}, errorMessage: "key - has an invalid length. Please use keys with a length of 1 to 128 characters", }, { - id: component.NewIDWithName(typeStr, "key-too-long"), + id: component.NewIDWithName(metadata.Type, "key-too-long"), tags: map[string]*string{strings.Repeat("a", 129): &basicValue}, errorMessage: "key - " + strings.Repeat("a", 129) + " has an invalid length. Please use keys with a length of 1 to 128 characters", }, { - id: component.NewIDWithName(typeStr, "value-too-short"), + id: component.NewIDWithName(metadata.Type, "value-too-short"), tags: map[string]*string{"basicKey": &emptyValue}, errorMessage: "value - " + emptyValue + " has an invalid length. Please use values with a length of 1 to 256 characters", }, { - id: component.NewIDWithName(typeStr, "value-too-long"), + id: component.NewIDWithName(metadata.Type, "value-too-long"), tags: map[string]*string{"basicKey": &tooLongValue}, errorMessage: "value - " + tooLongValue + " has an invalid length. Please use values with a length of 1 to 256 characters", }, diff --git a/exporter/awsemfexporter/doc.go b/exporter/awsemfexporter/doc.go index 7ae3aae146ae..fe011986dea6 100644 --- a/exporter/awsemfexporter/doc.go +++ b/exporter/awsemfexporter/doc.go @@ -4,13 +4,14 @@ // 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 +// 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. +//go:generate mdatagen metadata.yaml // Package awsemfexporter implements an OpenTelemetry Collector exporter that sends EmbeddedMetricFormat to // AWS CloudWatch Logs in the region the collector is running in using the PutLogEvents API. diff --git a/exporter/awsemfexporter/factory.go b/exporter/awsemfexporter/factory.go index 97054292b1a8..1f8b0f4e94c2 100644 --- a/exporter/awsemfexporter/factory.go +++ b/exporter/awsemfexporter/factory.go @@ -22,23 +22,17 @@ import ( "go.opentelemetry.io/collector/exporter/exporterhelper" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter/internal/metadata" "github.com/open-telemetry/opentelemetry-collector-contrib/internal/aws/awsutil" "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry" ) -const ( - // The value of "type" key in configuration. - typeStr = "awsemf" - // The stability level of the exporter. - stability = component.StabilityLevelBeta -) - // NewFactory creates a factory for AWS EMF exporter. func NewFactory() exporter.Factory { return exporter.NewFactory( - typeStr, + metadata.Type, createDefaultConfig, - exporter.WithMetrics(createMetricsExporter, stability)) + exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability)) } // CreateDefaultConfig creates the default configuration for exporter. diff --git a/exporter/awsemfexporter/factory_test.go b/exporter/awsemfexporter/factory_test.go index 3a4ea9ebc6ae..9b99f3d7b73d 100644 --- a/exporter/awsemfexporter/factory_test.go +++ b/exporter/awsemfexporter/factory_test.go @@ -25,6 +25,8 @@ import ( "go.opentelemetry.io/collector/component/componenttest" "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/exporter/exportertest" + + "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/awsemfexporter/internal/metadata" ) func TestCreateDefaultConfig(t *testing.T) { @@ -41,7 +43,7 @@ func TestCreateTracesExporter(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(typeStr, "1").String()) + sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "1").String()) require.NoError(t, err) require.NoError(t, component.UnmarshalConfig(sub, cfg)) @@ -57,7 +59,7 @@ func TestCreateMetricsExporter(t *testing.T) { factory := NewFactory() cfg := factory.CreateDefaultConfig() - sub, err := cm.Sub(component.NewIDWithName(typeStr, "1").String()) + sub, err := cm.Sub(component.NewIDWithName(metadata.Type, "1").String()) require.NoError(t, err) require.NoError(t, component.UnmarshalConfig(sub, cfg)) diff --git a/exporter/awsemfexporter/internal/metadata/generated_status.go b/exporter/awsemfexporter/internal/metadata/generated_status.go new file mode 100644 index 000000000000..4496ea408180 --- /dev/null +++ b/exporter/awsemfexporter/internal/metadata/generated_status.go @@ -0,0 +1,12 @@ +// Code generated by mdatagen. DO NOT EDIT. + +package metadata + +import ( + "go.opentelemetry.io/collector/component" +) + +const ( + Type = "awsemf" + MetricsStability = component.StabilityLevelBeta +) diff --git a/exporter/awsemfexporter/metadata.yaml b/exporter/awsemfexporter/metadata.yaml new file mode 100644 index 000000000000..6cc584c6cc2d --- /dev/null +++ b/exporter/awsemfexporter/metadata.yaml @@ -0,0 +1,7 @@ +type: awsemf + +status: + class: exporter + stability: + beta: [metrics] + distributions: [contrib, aws]