-
Notifications
You must be signed in to change notification settings - Fork 769
/
ResourceBuilder.cs
114 lines (96 loc) · 4.25 KB
/
ResourceBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// <copyright file="ResourceBuilder.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// 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
//
// 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.
// </copyright>
using System.Collections.Generic;
using OpenTelemetry.Internal;
namespace OpenTelemetry.Resources
{
/// <summary>
/// Contains methods for building <see cref="Resource"/> instances.
/// </summary>
public class ResourceBuilder
{
private readonly List<Resource> resources = new List<Resource>();
private ResourceBuilder()
{
}
private static Resource DefaultResource { get; } = new Resource(new Dictionary<string, object>
{
[ResourceSemanticConventions.AttributeServiceName] = "unknown_service"
+ (string.IsNullOrWhiteSpace(System.Diagnostics.Process.GetCurrentProcess().ProcessName)
? string.Empty :
":" + System.Diagnostics.Process.GetCurrentProcess().ProcessName),
});
/// <summary>
/// Creates a <see cref="ResourceBuilder"/> instance with Default
/// service.name added. See <a
/// href="https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions#semantic-attributes-with-sdk-provided-default-value">resource
/// semantic conventions</a> for details.
/// Additionally it adds resource attributes parsed from OTEL_RESOURCE_ATTRIBUTES, OTEL_SERVICE_NAME environment variables
/// to a <see cref="ResourceBuilder"/> following the <a
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/sdk.md#specifying-resource-information-via-an-environment-variable">Resource
/// SDK</a>.
/// </summary>
/// <returns>Created <see cref="ResourceBuilder"/>.</returns>
public static ResourceBuilder CreateDefault()
=> new ResourceBuilder().AddResource(DefaultResource).AddEnvironmentVariableDetector();
/// <summary>
/// Creates an empty <see cref="ResourceBuilder"/> instance.
/// </summary>
/// <returns>Created <see cref="ResourceBuilder"/>.</returns>
public static ResourceBuilder CreateEmpty()
=> new ResourceBuilder();
/// <summary>
/// Clears the <see cref="Resource"/>s added to the builder.
/// </summary>
/// <returns><see cref="ResourceBuilder"/> for chaining.</returns>
public ResourceBuilder Clear()
{
this.resources.Clear();
return this;
}
/// <summary>
/// Build a merged <see cref="Resource"/> from all the <see cref="Resource"/>s added to the builder.
/// </summary>
/// <returns><see cref="Resource"/>.</returns>
public Resource Build()
{
Resource finalResource = Resource.Empty;
foreach (Resource resource in this.resources)
{
finalResource = finalResource.Merge(resource);
}
return finalResource;
}
// Internal until spec is finalized.
// https://github.com/open-telemetry/oteps/blob/master/text/0111-auto-resource-detection.md
internal ResourceBuilder AddDetector(IResourceDetector resourceDetector)
{
Guard.ThrowIfNull(resourceDetector, nameof(resourceDetector));
Resource resource = resourceDetector.Detect();
if (resource != null)
{
this.resources.Add(resource);
}
return this;
}
internal ResourceBuilder AddResource(Resource resource)
{
Guard.ThrowIfNull(resource, nameof(resource));
this.resources.Add(resource);
return this;
}
}
}