Skip to content

Commit

Permalink
Metrics SDK: View API (#1110)
Browse files Browse the repository at this point in the history
  • Loading branch information
lalitb authored Dec 27, 2021
1 parent de276f5 commit 09fb4e0
Show file tree
Hide file tree
Showing 17 changed files with 641 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,23 @@
#pragma once
#ifndef ENABLE_METRICS_PREVIEW
# include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace metrics
{
/**
* View defines the interface to allow SDK user to
* customize the metrics before exported.
*/

class View
class Aggregator
{
// TBD
};

class NoOpAggregator : public Aggregator
{
public:
virtual ~View() = default;
// TBD
};

} // namespace metrics
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
#endif
#endif
52 changes: 52 additions & 0 deletions sdk/include/opentelemetry/sdk/metrics/instruments.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once
#ifndef ENABLE_METRICS_PREVIEW
# include "opentelemetry/nostd/string_view.h"
OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace metrics
{
enum class InstrumentType
{
kCounter,
kHistogram,
kUpDownCounter,
kObservableCounter,
kObservableGauge,
kObservableUpDownCounter
};

enum class InstrumentValueType
{
kInt,
kLong,
kFloat,
kDouble
};

struct InstrumentDescriptor
{
std::string name_;
std::string description_;
std::string unit_;
InstrumentType type_;
InstrumentValueType valueType_;
};

/*class InstrumentSelector {
public:
InstrumentSelector(opentelemetry::nostd::string_view name,
opentelemetry::sdk::metrics::InstrumentType type): name_(name.data()), type_(type) {} InstrumentType
GetType(){return type_;} std::string GetNameFilter() { return name_;}
private:
std::string name_;
InstrumentType type_;
};*/
} // namespace metrics
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
#endif
21 changes: 13 additions & 8 deletions sdk/include/opentelemetry/sdk/metrics/meter_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
# include <vector>
# include "opentelemetry/sdk/metrics/metric_exporter.h"
# include "opentelemetry/sdk/metrics/metric_reader.h"
# include "opentelemetry/sdk/metrics/view.h"
# include "opentelemetry/sdk/metrics/view/instrument_selector.h"
# include "opentelemetry/sdk/metrics/view/meter_selector.h"
# include "opentelemetry/sdk/metrics/view/view_registry.h"
# include "opentelemetry/sdk/resource/resource.h"
# include "opentelemetry/version.h"

Expand All @@ -31,11 +33,12 @@ class MeterContext
* @param views The views to be configured with meter context.
* @param resource The resource for this meter context.
*/
MeterContext(std::vector<std::unique_ptr<sdk::metrics::MetricExporter>> &&exporters,
std::vector<std::unique_ptr<MetricReader>> &&readers,
std::vector<std::unique_ptr<View>> &&views,
opentelemetry::sdk::resource::Resource resource =
opentelemetry::sdk::resource::Resource::Create({})) noexcept;
MeterContext(
std::vector<std::unique_ptr<sdk::metrics::MetricExporter>> &&exporters,
std::vector<std::unique_ptr<MetricReader>> &&readers,
std::unique_ptr<ViewRegistry> views = std::unique_ptr<ViewRegistry>(new ViewRegistry()),
opentelemetry::sdk::resource::Resource resource =
opentelemetry::sdk::resource::Resource::Create({})) noexcept;

/**
* Obtain the resource associated with this meter context.
Expand Down Expand Up @@ -71,7 +74,9 @@ class MeterContext
* Note: This view may not receive any in-flight meter data, but will get newly created meter
* data. Note: This method is not thread safe, and should ideally be called from main thread.
*/
void AddView(std::unique_ptr<View> view) noexcept;
void AddView(std::unique_ptr<InstrumentSelector> instrument_selector,
std::unique_ptr<MeterSelector> meter_selector,
std::unique_ptr<View> view) noexcept;

/**
* Force all active Exporters and Readers to flush any buffered meter data
Expand All @@ -89,7 +94,7 @@ class MeterContext
opentelemetry::sdk::resource::Resource resource_;
std::vector<std::unique_ptr<MetricExporter>> exporters_;
std::vector<std::unique_ptr<MetricReader>> readers_;
std::vector<std::unique_ptr<View>> views_;
std::unique_ptr<ViewRegistry> views_;
};

} // namespace metrics
Expand Down
13 changes: 8 additions & 5 deletions sdk/include/opentelemetry/sdk/metrics/meter_provider.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@ class MeterProvider final : public opentelemetry::metrics::MeterProvider
* @param views The views for this meter provider
* @param resource The resources for this meter provider.
*/
MeterProvider(std::vector<std::unique_ptr<MetricExporter>> &&exporters,
std::vector<std::unique_ptr<MetricReader>> &&readers,
std::vector<std::unique_ptr<View>> &&views,
sdk::resource::Resource resource = sdk::resource::Resource::Create({})) noexcept;
MeterProvider(
std::vector<std::unique_ptr<MetricExporter>> &&exporters,
std::vector<std::unique_ptr<MetricReader>> &&readers,
std::unique_ptr<ViewRegistry> views = std::unique_ptr<ViewRegistry>(new ViewRegistry()),
sdk::resource::Resource resource = sdk::resource::Resource::Create({})) noexcept;

/**
* Initialize a new meter provider with a specified context
Expand Down Expand Up @@ -78,7 +79,9 @@ class MeterProvider final : public opentelemetry::metrics::MeterProvider
* Note: This view may not receive any in-flight meter data, but will get newly created meter
* data. Note: This method is not thread safe, and should ideally be called from main thread.
*/
void AddView(std::unique_ptr<View> view) noexcept;
void AddView(std::unique_ptr<InstrumentSelector> instrument_selector,
std::unique_ptr<MeterSelector> meter_selector,
std::unique_ptr<View> view) noexcept;

/**
* Shutdown the meter provider.
Expand Down
49 changes: 49 additions & 0 deletions sdk/include/opentelemetry/sdk/metrics/view/aggregation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once
#ifndef ENABLE_METRICS_PREVIEW

# include <memory>
# include "opentelemetry/sdk/metrics/aggregator/aggregator.h"
# include "opentelemetry/sdk/metrics/instruments.h"
OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace metrics
{
class Aggregation
{
public:
virtual ~Aggregation() = default;
virtual opentelemetry::sdk::metrics::Aggregator &CreateAggregator(
opentelemetry::sdk::metrics::InstrumentDescriptor instrument_descriptor) noexcept = 0;
};

class NoOpAggregation : public Aggregation
{

opentelemetry::sdk::metrics::Aggregator &CreateAggregator(
opentelemetry::sdk::metrics::InstrumentDescriptor instrument_descriptor) noexcept override
{
static opentelemetry::sdk::metrics::NoOpAggregator noop_aggregator;
return noop_aggregator;
}
};

class DefaultAggregation : public Aggregation
{

opentelemetry::sdk::metrics::Aggregator &CreateAggregator(
opentelemetry::sdk::metrics::InstrumentDescriptor instrument_descriptor) noexcept override
{
// TBD - This shouldn't return noop_aggregator
static opentelemetry::sdk::metrics::NoOpAggregator noop_aggregator;
return noop_aggregator;
}
};

} // namespace metrics
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
#endif
34 changes: 34 additions & 0 deletions sdk/include/opentelemetry/sdk/metrics/view/attributes_processor.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once
#ifndef ENABLE_METRICS_PREVIEW
# include "opentelemetry/sdk/common/attribute_utils.h"
OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace metrics
{
using MetricAttributes = opentelemetry::sdk::common::AttributeMap;

class AttributesProcessor
{
public:
virtual MetricAttributes process(
const opentelemetry::common::KeyValueIterable &attributes) noexcept = 0;
};

class DefaultAttributesProcessor : public AttributesProcessor
{
MetricAttributes process(
const opentelemetry::common::KeyValueIterable &attributes) noexcept override
{
MetricAttributes result(attributes);
return result;
}
};

} // namespace metrics
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
#endif
36 changes: 36 additions & 0 deletions sdk/include/opentelemetry/sdk/metrics/view/instrument_selector.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once
#ifndef ENABLE_METRICS_PREVIEW
# include "opentelemetry/nostd/string_view.h"
# include "opentelemetry/sdk/metrics/instruments.h"
# include "opentelemetry/sdk/metrics/view/predicate_factory.h"
OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace metrics
{
class InstrumentSelector
{
public:
InstrumentSelector(opentelemetry::sdk::metrics::InstrumentType instrument_type,
opentelemetry::nostd::string_view name)
: name_filter_{std::move(PredicateFactory::GetPredicate(name, PredicateType::kPattern))},
instrument_type_{instrument_type}
{}

// Returns name filter predicate. This shouldn't be deleted
const opentelemetry::sdk::metrics::Predicate *const GetNameFilter() { return name_filter_.get(); }

// Returns instrument filter.
InstrumentType GetInstrumentType() { return instrument_type_; }

private:
opentelemetry::sdk::metrics::InstrumentType instrument_type_;
std::unique_ptr<opentelemetry::sdk::metrics::Predicate> name_filter_;
};
} // namespace metrics
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
#endif
47 changes: 47 additions & 0 deletions sdk/include/opentelemetry/sdk/metrics/view/meter_selector.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

#pragma once
#include "opentelemetry/nostd/string_view.h"
#include "opentelemetry/sdk/metrics/view/predicate_factory.h"
#ifndef ENABLE_METRICS_PREVIEW
OPENTELEMETRY_BEGIN_NAMESPACE
namespace sdk
{
namespace metrics
{
class MeterSelector
{
public:
MeterSelector(opentelemetry::nostd::string_view name,
opentelemetry::nostd::string_view version,
opentelemetry::nostd::string_view schema)
: name_filter_{std::move(PredicateFactory::GetPredicate(name, PredicateType::kExact))},
version_filter_{std::move(PredicateFactory::GetPredicate(version, PredicateType::kExact))},
schema_filter_{std::move(PredicateFactory::GetPredicate(schema, PredicateType::kExact))}
{}

// Returns name filter predicate. This shouldn't be deleted
const opentelemetry::sdk::metrics::Predicate *const GetNameFilter() { return name_filter_.get(); }

// Returns version filter predicate. This shouldn't be deleted
const opentelemetry::sdk::metrics::Predicate *const GetVersionFilter()
{
return version_filter_.get();
}

// Returns schema filter predicate. This shouldn't be deleted
const opentelemetry::sdk::metrics::Predicate *const GetSchemaFilter()
{
return schema_filter_.get();
}

private:
std::unique_ptr<opentelemetry::sdk::metrics::Predicate> name_filter_;
std::unique_ptr<opentelemetry::sdk::metrics::Predicate> version_filter_;
std::unique_ptr<opentelemetry::sdk::metrics::Predicate> schema_filter_;
};
} // namespace metrics
} // namespace sdk
OPENTELEMETRY_END_NAMESPACE
#endif
Loading

0 comments on commit 09fb4e0

Please sign in to comment.