Skip to content

Commit 7a78dd0

Browse files
authored
[CONFIGURATION] File configuration - yaml parser (#3519)
1 parent cafcfaa commit 7a78dd0

12 files changed

+1395
-0
lines changed

sdk/include/opentelemetry/sdk/configuration/configuration.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@
3434
* Yaml node OpenTelemetryConfiguration,
3535
* in file
3636
* https://github.com/open-telemetry/opentelemetry-configuration/blob/main/schema/opentelemetry_configuration.json
37+
*
38+
* Every property in the yaml schema is already documented in the
39+
* opentelemetry-configuration repository,
40+
* in file schema/type_descriptions.yaml, see
41+
* https://github.com/open-telemetry/opentelemetry-configuration/blob/main/schema/type_descriptions.yaml
42+
*
43+
* As a result, C++ class members representing yaml properties are not
44+
* commented with details, refer to the source of truth in
45+
* type_descriptions.yaml directly.
3746
*/
3847

3948
OPENTELEMETRY_BEGIN_NAMESPACE
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <memory>
7+
8+
#include "opentelemetry/sdk/configuration/configuration.h"
9+
#include "opentelemetry/sdk/configuration/document_node.h"
10+
#include "opentelemetry/version.h"
11+
12+
OPENTELEMETRY_BEGIN_NAMESPACE
13+
namespace sdk
14+
{
15+
namespace configuration
16+
{
17+
18+
class ConfigurationParser
19+
{
20+
public:
21+
static std::unique_ptr<Configuration> Parse(std::unique_ptr<Document> doc);
22+
};
23+
24+
} // namespace configuration
25+
} // namespace sdk
26+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <memory>
7+
#include <string>
8+
9+
#include "opentelemetry/sdk/configuration/document_node.h"
10+
#include "opentelemetry/version.h"
11+
12+
OPENTELEMETRY_BEGIN_NAMESPACE
13+
namespace sdk
14+
{
15+
namespace configuration
16+
{
17+
18+
class Document
19+
{
20+
public:
21+
Document() = default;
22+
Document(Document &&) = default;
23+
Document(const Document &) = default;
24+
Document &operator=(Document &&) = default;
25+
Document &operator=(const Document &other) = default;
26+
virtual ~Document() = default;
27+
28+
virtual std::unique_ptr<DocumentNode> GetRootNode() = 0;
29+
};
30+
31+
} // namespace configuration
32+
} // namespace sdk
33+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <memory>
7+
#include <string>
8+
9+
#include "opentelemetry/version.h"
10+
11+
OPENTELEMETRY_BEGIN_NAMESPACE
12+
namespace sdk
13+
{
14+
namespace configuration
15+
{
16+
17+
class DocumentNodeConstIterator;
18+
class PropertiesNodeConstIterator;
19+
20+
class DocumentNode
21+
{
22+
public:
23+
// FIXME: proper sizing
24+
static constexpr std::size_t MAX_NODE_DEPTH = 100;
25+
26+
DocumentNode() = default;
27+
DocumentNode(DocumentNode &&) = default;
28+
DocumentNode(const DocumentNode &) = default;
29+
DocumentNode &operator=(DocumentNode &&) = default;
30+
DocumentNode &operator=(const DocumentNode &other) = default;
31+
virtual ~DocumentNode() = default;
32+
33+
virtual std::string Key() const = 0;
34+
35+
virtual bool AsBoolean() const = 0;
36+
virtual std::size_t AsInteger() const = 0;
37+
virtual double AsDouble() const = 0;
38+
virtual std::string AsString() const = 0;
39+
40+
virtual std::unique_ptr<DocumentNode> GetRequiredChildNode(const std::string &name) const = 0;
41+
virtual std::unique_ptr<DocumentNode> GetChildNode(const std::string &name) const = 0;
42+
43+
virtual bool GetRequiredBoolean(const std::string &name) const = 0;
44+
virtual bool GetBoolean(const std::string &name, bool default_value) const = 0;
45+
46+
virtual std::size_t GetRequiredInteger(const std::string &name) const = 0;
47+
virtual std::size_t GetInteger(const std::string &name, std::size_t default_value) const = 0;
48+
49+
virtual double GetRequiredDouble(const std::string &name) const = 0;
50+
virtual double GetDouble(const std::string &name, double default_value) const = 0;
51+
52+
virtual std::string GetRequiredString(const std::string &name) const = 0;
53+
virtual std::string GetString(const std::string &name,
54+
const std::string &default_value) const = 0;
55+
56+
virtual DocumentNodeConstIterator begin() const = 0;
57+
virtual DocumentNodeConstIterator end() const = 0;
58+
59+
virtual std::size_t num_children() const = 0;
60+
virtual std::unique_ptr<DocumentNode> GetChild(std::size_t index) const = 0;
61+
62+
virtual PropertiesNodeConstIterator begin_properties() const = 0;
63+
virtual PropertiesNodeConstIterator end_properties() const = 0;
64+
65+
protected:
66+
std::string DoSubstitution(const std::string &text) const;
67+
std::string DoOneSubstitution(const std::string &text) const;
68+
69+
bool BooleanFromString(const std::string &value) const;
70+
std::size_t IntegerFromString(const std::string &value) const;
71+
double DoubleFromString(const std::string &value) const;
72+
};
73+
74+
class DocumentNodeConstIteratorImpl
75+
{
76+
public:
77+
DocumentNodeConstIteratorImpl() = default;
78+
DocumentNodeConstIteratorImpl(DocumentNodeConstIteratorImpl &&) = default;
79+
DocumentNodeConstIteratorImpl(const DocumentNodeConstIteratorImpl &) = default;
80+
DocumentNodeConstIteratorImpl &operator=(DocumentNodeConstIteratorImpl &&) = default;
81+
DocumentNodeConstIteratorImpl &operator=(const DocumentNodeConstIteratorImpl &other) = default;
82+
virtual ~DocumentNodeConstIteratorImpl() = default;
83+
84+
virtual void Next() = 0;
85+
virtual std::unique_ptr<DocumentNode> Item() const = 0;
86+
virtual bool Equal(const DocumentNodeConstIteratorImpl *rhs) const = 0;
87+
};
88+
89+
class PropertiesNodeConstIteratorImpl
90+
{
91+
public:
92+
PropertiesNodeConstIteratorImpl() = default;
93+
PropertiesNodeConstIteratorImpl(PropertiesNodeConstIteratorImpl &&) = default;
94+
PropertiesNodeConstIteratorImpl(const PropertiesNodeConstIteratorImpl &) = default;
95+
PropertiesNodeConstIteratorImpl &operator=(PropertiesNodeConstIteratorImpl &&) = default;
96+
PropertiesNodeConstIteratorImpl &operator=(const PropertiesNodeConstIteratorImpl &other) =
97+
default;
98+
virtual ~PropertiesNodeConstIteratorImpl() = default;
99+
100+
virtual void Next() = 0;
101+
virtual std::string Name() const = 0;
102+
virtual std::unique_ptr<DocumentNode> Value() const = 0;
103+
virtual bool Equal(const PropertiesNodeConstIteratorImpl *rhs) const = 0;
104+
};
105+
106+
class DocumentNodeConstIterator
107+
{
108+
public:
109+
DocumentNodeConstIterator(std::unique_ptr<DocumentNodeConstIteratorImpl> impl)
110+
: impl_(std::move(impl))
111+
{}
112+
DocumentNodeConstIterator(DocumentNodeConstIterator &&) = default;
113+
DocumentNodeConstIterator(const DocumentNodeConstIterator &) = delete;
114+
DocumentNodeConstIterator &operator=(DocumentNodeConstIterator &&) = default;
115+
DocumentNodeConstIterator &operator=(const DocumentNodeConstIterator &other) = delete;
116+
~DocumentNodeConstIterator() = default;
117+
118+
bool operator==(const DocumentNodeConstIterator &rhs) const
119+
{
120+
return (impl_->Equal(rhs.impl_.get()));
121+
}
122+
123+
bool operator!=(const DocumentNodeConstIterator &rhs) const
124+
{
125+
return (!impl_->Equal(rhs.impl_.get()));
126+
}
127+
128+
std::unique_ptr<DocumentNode> operator*() const { return impl_->Item(); }
129+
130+
DocumentNodeConstIterator &operator++()
131+
{
132+
impl_->Next();
133+
return *this;
134+
}
135+
136+
private:
137+
std::unique_ptr<DocumentNodeConstIteratorImpl> impl_;
138+
};
139+
140+
class PropertiesNodeConstIterator
141+
{
142+
public:
143+
PropertiesNodeConstIterator(std::unique_ptr<PropertiesNodeConstIteratorImpl> impl)
144+
: impl_(std::move(impl))
145+
{}
146+
PropertiesNodeConstIterator(PropertiesNodeConstIterator &&) = default;
147+
PropertiesNodeConstIterator(const PropertiesNodeConstIterator &) = delete;
148+
PropertiesNodeConstIterator &operator=(PropertiesNodeConstIterator &&) = default;
149+
PropertiesNodeConstIterator &operator=(const PropertiesNodeConstIterator &other) = delete;
150+
~PropertiesNodeConstIterator() = default;
151+
152+
bool operator==(const PropertiesNodeConstIterator &rhs) const
153+
{
154+
return (impl_->Equal(rhs.impl_.get()));
155+
}
156+
157+
bool operator!=(const PropertiesNodeConstIterator &rhs) const
158+
{
159+
return (!impl_->Equal(rhs.impl_.get()));
160+
}
161+
162+
std::string Name() const { return impl_->Name(); }
163+
std::unique_ptr<DocumentNode> Value() const { return impl_->Value(); }
164+
165+
PropertiesNodeConstIterator &operator++()
166+
{
167+
impl_->Next();
168+
return *this;
169+
}
170+
171+
private:
172+
std::unique_ptr<PropertiesNodeConstIteratorImpl> impl_;
173+
};
174+
175+
} // namespace configuration
176+
} // namespace sdk
177+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <stdexcept>
7+
#include <string>
8+
9+
#include "opentelemetry/sdk/configuration/document.h"
10+
#include "opentelemetry/sdk/configuration/document_node.h"
11+
#include "opentelemetry/version.h"
12+
13+
OPENTELEMETRY_BEGIN_NAMESPACE
14+
namespace sdk
15+
{
16+
namespace configuration
17+
{
18+
19+
class InvalidSchemaException : public std::runtime_error
20+
{
21+
public:
22+
InvalidSchemaException(const std::string &msg) : std::runtime_error(msg) {}
23+
};
24+
25+
} // namespace configuration
26+
} // namespace sdk
27+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <memory>
7+
#include <ryml.hpp>
8+
#include <string>
9+
10+
#include "opentelemetry/sdk/configuration/document.h"
11+
#include "opentelemetry/sdk/configuration/document_node.h"
12+
#include "opentelemetry/version.h"
13+
14+
OPENTELEMETRY_BEGIN_NAMESPACE
15+
namespace sdk
16+
{
17+
namespace configuration
18+
{
19+
20+
class RymlDocument : public Document
21+
{
22+
public:
23+
static std::unique_ptr<Document> Parse(const std::string &source, const std::string &content);
24+
25+
RymlDocument(ryml::Tree tree) : tree_(std::move(tree)) {}
26+
RymlDocument(RymlDocument &&) = delete;
27+
RymlDocument(const RymlDocument &) = delete;
28+
RymlDocument &operator=(RymlDocument &&) = delete;
29+
RymlDocument &operator=(const RymlDocument &other) = delete;
30+
~RymlDocument() override = default;
31+
32+
std::unique_ptr<DocumentNode> GetRootNode() override;
33+
34+
private:
35+
ryml::Tree tree_;
36+
};
37+
38+
} // namespace configuration
39+
} // namespace sdk
40+
OPENTELEMETRY_END_NAMESPACE

0 commit comments

Comments
 (0)