github.com/grafana/pyroscope@v1.18.0/examples/language-sdk-instrumentation/dotnet/rideshare/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 }