Skip to content
Closed
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
c65ed4f
draft
Yun-Ting Jun 16, 2022
0470d1e
tests, api, dispose
Yun-Ting Jun 17, 2022
a56059f
update
Yun-Ting Jun 17, 2022
42af16c
Merge branch 'yunl/RefactorPrometheusExporter' of https://github.com/…
Yun-Ting Jun 17, 2022
7e9d50e
docs
Yun-Ting Jun 17, 2022
2afca92
markdown lint
Yun-Ting Jun 17, 2022
5c8786e
more tests fixing
Yun-Ting Jun 17, 2022
e3ffd30
docs and tests
Yun-Ting Jun 17, 2022
2349e71
fix CI
Yun-Ting Jun 17, 2022
a13b595
CI
Yun-Ting Jun 17, 2022
f3072ee
update
Yun-Ting Jun 17, 2022
a9eeaf6
readme
Yun-Ting Jun 17, 2022
b1e26e6
lint
Yun-Ting Jun 18, 2022
dec7d9d
Merge branch 'main' into yunl/RefactorPrometheusExporter
cijothomas Jun 18, 2022
7ffa076
Merge branch 'main' into yunl/RefactorPrometheusExporter
cijothomas Jun 20, 2022
63ba0a6
removed implementation folder
Yun-Ting Jun 22, 2022
b1a9ca5
change project reference to link
Yun-Ting Jun 22, 2022
a70d8fa
prometheus shared project tests
Yun-Ting Jun 22, 2022
fba6ab2
added OpenTelemetry.Exporter.Prometheus.HttpListener.Tests proj
Yun-Ting Jun 23, 2022
7c9fccd
added AspNetCore Tests
Yun-Ting Jun 23, 2022
bd7b885
renamed OpenTelemetry.Exporter.Prometheus to OpenTelemetry.Exporter.P…
Yun-Ting Jun 23, 2022
dc821e9
renamed test file
Yun-Ting Jun 23, 2022
7cfff77
project files
Yun-Ting Jun 24, 2022
291212a
delete Readme
Yun-Ting Jun 24, 2022
e182f8c
proj files and apis
Yun-Ting Jun 28, 2022
a038af0
proj
Yun-Ting Jun 28, 2022
dc96358
listener api change and addressed some comments
Yun-Ting Jun 29, 2022
0ed24d7
merge from main
Yun-Ting Jun 29, 2022
58c998b
cleaned up proj file
Yun-Ting Jun 29, 2022
304f27b
readme
Yun-Ting Jun 29, 2022
be87d44
docs
Yun-Ting Jun 29, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions OpenTelemetry.sln
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Extensions.Pr
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "correlation", "docs\logs\correlation\correlation.csproj", "{9A07D215-90AC-4BAF-BCDB-73D74FD3A5C5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTelemetry.Exporter.Prometheus.HttpListener", "src\OpenTelemetry.Exporter.Prometheus.HttpListener\OpenTelemetry.Exporter.Prometheus.HttpListener.csproj", "{2006398C-AEF0-4CE2-990F-F76933E3542F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTelemetry.Exporter.Prometheus.AspNetCore", "src\OpenTelemetry.Exporter.Prometheus.AspNetCore\OpenTelemetry.Exporter.Prometheus.AspNetCore.csproj", "{1AAF7405-7B82-4C84-9DA8-B0065F575DAE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -487,6 +491,14 @@ Global
{9A07D215-90AC-4BAF-BCDB-73D74FD3A5C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9A07D215-90AC-4BAF-BCDB-73D74FD3A5C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9A07D215-90AC-4BAF-BCDB-73D74FD3A5C5}.Release|Any CPU.Build.0 = Release|Any CPU
{2006398C-AEF0-4CE2-990F-F76933E3542F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2006398C-AEF0-4CE2-990F-F76933E3542F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2006398C-AEF0-4CE2-990F-F76933E3542F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2006398C-AEF0-4CE2-990F-F76933E3542F}.Release|Any CPU.Build.0 = Release|Any CPU
{1AAF7405-7B82-4C84-9DA8-B0065F575DAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1AAF7405-7B82-4C84-9DA8-B0065F575DAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1AAF7405-7B82-4C84-9DA8-B0065F575DAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1AAF7405-7B82-4C84-9DA8-B0065F575DAE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
using System.Diagnostics.Metrics;
using System.Threading;
using OpenTelemetry;
using OpenTelemetry.Exporter.Prometheus.HttpListener;
using OpenTelemetry.Metrics;

namespace GettingStartedPrometheusGrafana;
Expand All @@ -31,9 +32,12 @@ public static void Main()
{
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddMeter("MyCompany.MyProduct.MyLibrary")
.AddPrometheusExporter(options => { options.StartHttpListener = true; })
.AddPrometheusExporter()
.Build();

using var listener = new PrometheusHttpListener(meterProvider);
listener.Start();

Console.WriteLine("Press any key to exit");
while (!Console.KeyAvailable)
{
Expand Down
16 changes: 14 additions & 2 deletions docs/metrics/getting-started-prometheus-grafana/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,17 @@ And replace the below line:
with

```csharp
.AddPrometheusExporter(options => { options.StartHttpListener = true; })
.AddPrometheusExporter()
```

After the meterProvider is successfully built, create a PrometheusHttpListener
that takes in the meterProvider when constructed and passed in
the listener options for configuration.
call .Start() to start the listener.

```csharp
using var listener = new PrometheusHttpListener(meterProvider);
listener.Start();
```

With `AddPrometheusExporter()`, OpenTelemetry `PrometheusExporter` will export
Expand All @@ -60,7 +70,9 @@ graph LR
subgraph SDK
MeterProvider
MetricReader[BaseExportingMetricReader]
PrometheusExporter["PrometheusExporter<br/>(http://localhost:9464/)"]
subgraph PrometheusHttpListener
PrometheusExporter["PrometheusExporter<br/>(http://localhost:9464/)"]
end
end

subgraph API
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus\OpenTelemetry.Exporter.Prometheus.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus.HttpListener\OpenTelemetry.Exporter.Prometheus.HttpListener.csproj" />
</ItemGroup>
</Project>
6 changes: 5 additions & 1 deletion examples/AspNet/Examples.AspNet.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
Expand Down Expand Up @@ -118,6 +118,10 @@
<Project>{52158a12-e7ef-45a1-859f-06f9b17410cb}</Project>
<Name>OpenTelemetry.Exporter.Prometheus</Name>
</ProjectReference>
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus.HttpListener\OpenTelemetry.Exporter.Prometheus.HttpListener.csproj">
<Project>{2006398c-aef0-4ce2-990f-f76933e3542f}</Project>
<Name>OpenTelemetry.Exporter.Prometheus.HttpListener</Name>
</ProjectReference>
</ItemGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
Expand Down
22 changes: 14 additions & 8 deletions examples/AspNet/Global.asax.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
using System.Web.Routing;
using OpenTelemetry;
using OpenTelemetry.Exporter;
using OpenTelemetry.Exporter.Prometheus.HttpListener;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;

Expand All @@ -32,7 +33,8 @@ public class WebApiApplication : HttpApplication
#pragma warning restore SA1649 // File name should match first type name
{
private IDisposable tracerProvider;
private IDisposable meterProvider;
private MeterProvider meterProvider;
private PrometheusHttpListener listener;

protected void Application_Start()
{
Expand Down Expand Up @@ -78,24 +80,28 @@ protected void Application_Start()
switch (ConfigurationManager.AppSettings["UseMetricsExporter"].ToLowerInvariant())
{
case "otlp":
meterBuilder.AddOtlpExporter(otlpOptions =>
this.meterProvider = meterBuilder.AddOtlpExporter(otlpOptions =>
{
otlpOptions.Endpoint = new Uri(ConfigurationManager.AppSettings["OtlpEndpoint"]);
});
})
.Build();
break;
case "prometheus":
meterBuilder.AddPrometheusExporter();
this.meterProvider = meterBuilder.AddPrometheusExporter().Build();
this.listener = new PrometheusHttpListener(
this.meterProvider,
o => o.HttpListenerPrefixes = new string[] { "http://localhost:9464/metrics" });
this.listener.Start();
break;
default:
meterBuilder.AddConsoleExporter((exporterOptions, metricReaderOptions) =>
this.meterProvider = meterBuilder.AddConsoleExporter((exporterOptions, metricReaderOptions) =>
{
exporterOptions.Targets = ConsoleExporterOutputTargets.Debug;
});
})
.Build();
break;
}

this.meterProvider = meterBuilder.Build();

GlobalConfiguration.Configure(WebApiConfig.Register);

AreaRegistration.RegisterAllAreas();
Expand Down
1 change: 1 addition & 0 deletions examples/AspNetCore/Examples.AspNetCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Jaeger\OpenTelemetry.Exporter.Jaeger.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus\OpenTelemetry.Exporter.Prometheus.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Zipkin\OpenTelemetry.Exporter.Zipkin.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus.AspNetCore\OpenTelemetry.Exporter.Prometheus.AspNetCore.csproj" />
</ItemGroup>
</Project>
1 change: 1 addition & 0 deletions examples/Console/Examples.Console.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,6 @@
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.InMemory\OpenTelemetry.Exporter.InMemory.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus\OpenTelemetry.Exporter.Prometheus.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs\OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs.csproj" />
<ProjectReference Include="..\..\src\OpenTelemetry.Exporter.Prometheus.HttpListener\OpenTelemetry.Exporter.Prometheus.HttpListener.csproj" />
</ItemGroup>
</Project>
6 changes: 4 additions & 2 deletions examples/Console/TestPrometheusExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
using System.Threading;
using System.Threading.Tasks;
using OpenTelemetry;
using OpenTelemetry.Exporter.Prometheus.HttpListener;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;

Expand Down Expand Up @@ -53,12 +54,13 @@ internal static object Run(int port)
.AddMeter(MyMeter2.Name)
.AddPrometheusExporter(options =>
{
options.StartHttpListener = true;
options.HttpListenerPrefixes = new string[] { $"http://localhost:{port}/" };
options.ScrapeResponseCacheDurationMilliseconds = 0;
})
.Build();

using var listener = new PrometheusHttpListener(meterProvider, o => o.HttpListenerPrefixes = new string[] { $"http://localhost:{port}/" });
listener.Start();

var process = Process.GetCurrentProcess();
MyMeter.CreateObservableCounter("thread.cpu_time", () => GetThreadCpuTime(process), "ms");

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Microsoft.AspNetCore.Builder.PrometheusExporterApplicationBuilderExtensions
Microsoft.AspNetCore.Builder.PrometheusExporterEndpointRouteBuilderExtensions
static Microsoft.AspNetCore.Builder.PrometheusExporterApplicationBuilderExtensions.UseOpenTelemetryPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
static Microsoft.AspNetCore.Builder.PrometheusExporterApplicationBuilderExtensions.UseOpenTelemetryPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, OpenTelemetry.Metrics.MeterProvider meterProvider, System.Func<Microsoft.AspNetCore.Http.HttpContext, bool> predicate, string path, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> configureBranchedPipeline) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
static Microsoft.AspNetCore.Builder.PrometheusExporterApplicationBuilderExtensions.UseOpenTelemetryPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, string path) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
static Microsoft.AspNetCore.Builder.PrometheusExporterApplicationBuilderExtensions.UseOpenTelemetryPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, System.Func<Microsoft.AspNetCore.Http.HttpContext, bool> predicate) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
static Microsoft.AspNetCore.Builder.PrometheusExporterEndpointRouteBuilderExtensions.MapPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints) -> Microsoft.AspNetCore.Builder.IEndpointConventionBuilder
static Microsoft.AspNetCore.Builder.PrometheusExporterEndpointRouteBuilderExtensions.MapPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string path = null, OpenTelemetry.Metrics.MeterProvider meterProvider = null, System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder> configureBranchedPipeline = null) -> Microsoft.AspNetCore.Builder.IEndpointConventionBuilder
static Microsoft.AspNetCore.Builder.PrometheusExporterEndpointRouteBuilderExtensions.MapPrometheusScrapingEndpoint(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder endpoints, string path) -> Microsoft.AspNetCore.Builder.IEndpointConventionBuilder
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<!-- OmniSharp/VS Code requires TargetFrameworks to be in descending order for IntelliSense and analysis. -->
<TargetFrameworks>netcoreapp3.1;net462</TargetFrameworks>
<Description>Prometheus exporter for OpenTelemetry .NET</Description>
<PackageTags>$(PackageTags);prometheus;metrics</PackageTags>
<MinVerTagPrefix>core-</MinVerTagPrefix>
</PropertyGroup>

<PropertyGroup>
<NoWarn>$(NoWarn),1591</NoWarn>
</PropertyGroup>

<!--Do not run ApiCompat as this package has never released a stable version.
Remove this property once we have released a stable version.-->
<PropertyGroup>
<RunApiCompat>false</RunApiCompat>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry\OpenTelemetry.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus\OpenTelemetry.Exporter.Prometheus.csproj" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

</Project>

Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Exporter;
using OpenTelemetry.Exporter.Prometheus;
using OpenTelemetry.Exporter.Prometheus.AspNetCore;
using OpenTelemetry.Internal;
using OpenTelemetry.Metrics;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Exporter;
using OpenTelemetry.Exporter.Prometheus;
using OpenTelemetry.Exporter.Prometheus.AspNetCore;
using OpenTelemetry.Internal;
using OpenTelemetry.Metrics;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
using OpenTelemetry.Internal;
using OpenTelemetry.Metrics;

namespace OpenTelemetry.Exporter.Prometheus
namespace OpenTelemetry.Exporter.Prometheus.AspNetCore
{
/// <summary>
/// ASP.NET Core middleware for exposing a Prometheus metrics scraping endpoint.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.Dispose() -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.PrometheusHttpListener(OpenTelemetry.Metrics.MeterProvider meterProvider, System.Action<OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions> configure = null) -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.Start(System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.Stop() -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions.HttpListenerPrefixes.get -> System.Collections.Generic.IReadOnlyCollection<string>
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions.HttpListenerPrefixes.set -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions.PrometheusHttpListenerOptions() -> void
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.Dispose() -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.PrometheusHttpListener(OpenTelemetry.Metrics.MeterProvider meterProvider, System.Action<OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions> configure = null) -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.Start(System.Threading.CancellationToken token = default(System.Threading.CancellationToken)) -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListener.Stop() -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions.HttpListenerPrefixes.get -> System.Collections.Generic.IReadOnlyCollection<string>
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions.HttpListenerPrefixes.set -> void
OpenTelemetry.Exporter.Prometheus.HttpListener.PrometheusHttpListenerOptions.PrometheusHttpListenerOptions() -> void
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<!-- OmniSharp/VS Code requires TargetFrameworks to be in descending order for IntelliSense and analysis. -->
<TargetFrameworks>netcoreapp3.1;net462</TargetFrameworks>
<Description>Prometheus exporter for OpenTelemetry .NET</Description>
<PackageTags>$(PackageTags);prometheus;metrics</PackageTags>
<MinVerTagPrefix>core-</MinVerTagPrefix>
</PropertyGroup>

<PropertyGroup>
<NoWarn>$(NoWarn),1591</NoWarn>
</PropertyGroup>

<!--Do not run ApiCompat as this package has never released a stable version.
Remove this property once we have released a stable version.-->
<PropertyGroup>
<RunApiCompat>false</RunApiCompat>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry\OpenTelemetry.csproj" />
<ProjectReference Include="$(RepoRoot)\src\OpenTelemetry.Exporter.Prometheus\OpenTelemetry.Exporter.Prometheus.csproj" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

</Project>
Loading