github.com/grafana/pyroscope@v1.18.0/examples/tracing/dotnet/example/Program.cs (about)

     1  using System;
     2  using System.Collections.Generic;
     3  using System.IO;
     4  using System.Threading;
     5  using System.Collections;
     6  
     7  using Microsoft.AspNetCore.Http;
     8  using Microsoft.AspNetCore.Builder;
     9  using Microsoft.Extensions.DependencyInjection;
    10  
    11  using OpenTelemetry.Trace;
    12  
    13  using Pyroscope.OpenTelemetry;
    14  
    15  namespace Example;
    16  
    17  public static class Program
    18  {
    19      private static readonly List<FileStream> Files = new();
    20      public const string CustomActivitySourceName = "Example.ScooterService";
    21      public static void Main(string[] args)
    22      {
    23          for (int i = 0; i < 1024; i++)
    24          {
    25              Files.Add(File.Open("/dev/null", FileMode.Open, FileAccess.Read, FileShare.Read));
    26          }
    27          object globalLock = new();
    28          var strings = new List<string>();
    29  
    30          var orderService = new OrderService();
    31          var bikeService = new BikeService(orderService);
    32          var scooterService = new ScooterService(orderService);
    33          var carService = new CarService(orderService);
    34  
    35          var builder = WebApplication.CreateBuilder(args);
    36          builder.Services.AddOpenTelemetry()
    37              .WithTracing(b =>
    38              {
    39                  b
    40                  .AddAspNetCoreInstrumentation()
    41                  .AddSource(CustomActivitySourceName)
    42                  .AddConsoleExporter()
    43                  .AddOtlpExporter()
    44                  .AddProcessor(new PyroscopeSpanProcessor());
    45              });
    46          var app = builder.Build();
    47  
    48          app.MapGet("/bike", () =>
    49          {
    50              bikeService.Order(1);
    51              return "Bike ordered";
    52          });
    53          app.MapGet("/scooter", () =>
    54          {
    55              scooterService.Order(2);
    56              return "Scooter ordered";
    57          });
    58  
    59          app.MapGet("/car", () =>
    60          {
    61              carService.Order(3);
    62              return "Car ordered";
    63          });
    64          
    65          
    66          app.MapGet("/pyroscope/cpu", (HttpRequest request) =>
    67          {
    68              var enable = request.Query["enable"] == "true";
    69              Pyroscope.Profiler.Instance.SetCPUTrackingEnabled(enable);
    70              return "OK";
    71          });
    72          app.MapGet("/pyroscope/allocation", (HttpRequest request) =>
    73          {
    74              var enable = request.Query["enable"] == "true";
    75              Pyroscope.Profiler.Instance.SetAllocationTrackingEnabled(enable);
    76              return "OK";
    77          });
    78          app.MapGet("/pyroscope/contention", (HttpRequest request) =>
    79          {
    80              var enable = request.Query["enable"] == "true";
    81              Pyroscope.Profiler.Instance.SetContentionTrackingEnabled(enable);
    82              return "OK";
    83          });
    84          app.MapGet("/pyroscope/exception", (HttpRequest request) =>
    85          {
    86              var enable = request.Query["enable"] == "true";
    87              Pyroscope.Profiler.Instance.SetExceptionTrackingEnabled(enable);
    88              return "OK";
    89          });
    90          
    91          
    92          app.MapGet("/playground/allocation", (HttpRequest request) =>
    93          {
    94              var strings = new List<string>();
    95              for (var i = 0; i < 10000; i++)
    96              {
    97                  strings.Add("foobar" + i);
    98              }
    99  
   100              return "OK";
   101          });
   102          app.MapGet("/playground/contention", (HttpRequest request) =>
   103          {
   104              for (var i = 0; i < 100; i++)
   105              {
   106                  lock (globalLock)
   107                  {
   108                      Thread.Sleep(10);
   109                  }
   110              }
   111              return "OK";
   112          });
   113          app.MapGet("/playground/exception", (HttpRequest request) =>
   114          {
   115              for (var i = 0; i < 1000; i++)
   116              {
   117                  try
   118                  {
   119                      throw new Exception("foobar" + i);
   120                  }
   121                  catch (Exception)
   122                  {
   123                  }
   124              }
   125              return "OK";
   126          });
   127          app.MapGet("/playground/leak", (HttpRequest request) =>
   128          {
   129              for (var i = 0; i < 1000; i++)
   130              {
   131                  strings.Add("leak " + i);
   132              }
   133              return "OK";
   134          });
   135          app.MapGet("/", () =>
   136          {
   137              string env = "";
   138              foreach (DictionaryEntry e in System.Environment.GetEnvironmentVariables())
   139              {
   140                  env += e.Key + " = " + e.Value + "<br>\n";
   141              }
   142              return env;
   143          });
   144  
   145          app.Run();
   146      }
   147  }