Skip to content

Commit

Permalink
Introduce "split" metric schema transformation
Browse files Browse the repository at this point in the history
This is a new transformation type that allows to describe a change
where a metric is converted to several other metrics by eliminating
an attribute.

An example of such change that happened recently is this:
open-telemetry/opentelemetry-specification#2617

This PR implements specification change open-telemetry/opentelemetry-specification#2653

This PR creates package v1.1 for the new functionality. The old package v1.0
remains unchanged.
  • Loading branch information
tigrannajaryan committed Jul 11, 2022
1 parent eb9e058 commit d77bc30
Show file tree
Hide file tree
Showing 12 changed files with 703 additions and 147 deletions.
4 changes: 2 additions & 2 deletions schema/README.md
Expand Up @@ -11,9 +11,9 @@ then import the corresponding package and use the `Parse` or `ParseFile` functio
like this:

```go
import schema "go.opentelemetry.io/otel/schema/v1.0"
import schema "go.opentelemetry.io/otel/schema/v1.1"

// Load the schema from a file in v1.0.x file format.
// Load the schema from a file in v1.1.x file format.
func loadSchemaFromFile() error {
telSchema, err := schema.ParseFile("schema-file.yaml")
if err != nil {
Expand Down
58 changes: 58 additions & 0 deletions schema/internal/parser_checks.go
@@ -0,0 +1,58 @@
package internal

import (
"fmt"
"net/url"
"strconv"
"strings"

"github.com/Masterminds/semver/v3"
)

// CheckFileFormatField validates the file format field according to the rules here:
// https://github.com/open-telemetry/oteps/blob/main/text/0152-telemetry-schemas.md#schema-file-format-number
func CheckFileFormatField(fileFormat string, supportedFormatMajor, supportedFormatMinor int) error {
// Verify that the version number in the file is a semver.
fileFormatParsed, err := semver.StrictNewVersion(fileFormat)
if err != nil {
return fmt.Errorf(
"invalid schema file format version number %q (expected semver): %w",
fileFormat, err,
)
}

// Check that the major version number in the file is the same as what we expect.
if fileFormatParsed.Major() != uint64(supportedFormatMajor) {
return fmt.Errorf(
"this library cannot parse file formats with major version other than %v",
supportedFormatMajor,
)
}

// Check that the file minor version number is not greater than
// what is requested supports.
if fileFormatParsed.Minor() > uint64(supportedFormatMinor) {
supportedFormatMajorMinor := strconv.Itoa(supportedFormatMajor) + "." +
strconv.Itoa(supportedFormatMinor) // 1.0

return fmt.Errorf(
"unsupported schema file format minor version number, expected no newer than %v, got %v",
supportedFormatMajorMinor+".x", fileFormat,
)
}

// Patch, prerelease and metadata version number does not matter, so we don't check it.

return nil
}

func CheckSchemaURL(schemaURL string) error {
if strings.TrimSpace(schemaURL) == "" {
return fmt.Errorf("schema_url field is missing")
}

if _, err := url.Parse(schemaURL); err != nil {
return fmt.Errorf("invalid URL specified in schema_url field: %w", err)
}
return nil
}
56 changes: 6 additions & 50 deletions schema/v1.0/parser.go
Expand Up @@ -15,14 +15,10 @@
package schema // import "go.opentelemetry.io/otel/schema/v1.0"

import (
"fmt"
"io"
"net/url"
"os"
"strconv"
"strings"

"github.com/Masterminds/semver/v3"
"go.opentelemetry.io/otel/schema/internal"
"gopkg.in/yaml.v2"

"go.opentelemetry.io/otel/schema/v1.0/ast"
Expand All @@ -34,10 +30,6 @@ const supportedFormatMajor = 1
// Maximum minor version number that this library supports.
const supportedFormatMinor = 0

// Maximum major+minor version number that this library supports, as a string.
var supportedFormatMajorMinor = strconv.Itoa(supportedFormatMajor) + "." +
strconv.Itoa(supportedFormatMinor) // 1.0

// ParseFile a schema file. schemaFilePath is the file path.
func ParseFile(schemaFilePath string) (*ast.Schema, error) {
file, err := os.Open(schemaFilePath)
Expand All @@ -56,51 +48,15 @@ func Parse(schemaFileContent io.Reader) (*ast.Schema, error) {
return nil, err
}

if err := checkFileFormatField(ts.FileFormat); err != nil {
err = internal.CheckFileFormatField(ts.FileFormat, supportedFormatMajor, supportedFormatMinor)
if err != nil {
return nil, err
}

if strings.TrimSpace(ts.SchemaURL) == "" {
return nil, fmt.Errorf("schema_url field is missing")
}

if _, err := url.Parse(ts.SchemaURL); err != nil {
return nil, fmt.Errorf("invalid URL specified in schema_url field: %w", err)
}

return &ts, nil
}

// checkFileFormatField validates the file format field according to the rules here:
// https://github.com/open-telemetry/oteps/blob/main/text/0152-telemetry-schemas.md#schema-file-format-number
func checkFileFormatField(fileFormat string) error {
// Verify that the version number in the file is a semver.
fileFormatParsed, err := semver.StrictNewVersion(fileFormat)
err = internal.CheckSchemaURL(ts.SchemaURL)
if err != nil {
return fmt.Errorf(
"invalid schema file format version number %q (expected semver): %w",
fileFormat, err,
)
}

// Check that the major version number in the file is the same as what we expect.
if fileFormatParsed.Major() != supportedFormatMajor {
return fmt.Errorf(
"this library cannot parse file formats with major version other than %v",
supportedFormatMajor,
)
}

// Check that the file minor version number is not greater than
// what is requested supports.
if fileFormatParsed.Minor() > supportedFormatMinor {
return fmt.Errorf(
"unsupported schema file format minor version number, expected no newer than %v, got %v",
supportedFormatMajorMinor+".x", fileFormat,
)
return nil, err
}

// Patch, prerelease and metadata version number does not matter, so we don't check it.

return nil
return &ts, nil
}

0 comments on commit d77bc30

Please sign in to comment.