Seriloog / SeriLoog / Controllers / DemoController.cs
Code · 73 lines · 2738 bytes
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
73using Microsoft.AspNetCore.Mvc;

namespace SeriLoog.Controllers;

[ApiController]
[Route("api/[controller]")]
public sealed class DemoController : ControllerBase
{
    private readonly ILogger<DemoController> _logger;
    private static readonly string[] Users = { "alphons", "marieke", "jeroen", "sanne", "kees" };
    private static readonly string[] Orders = { "ORD-1001", "ORD-1002", "ORD-1003", "ORD-1004" };
    private static readonly Random Rng = new();

    public DemoController(ILogger<DemoController> logger)
    {
        _logger = logger;
    }

    [HttpPost("generate")]
    public IActionResult Generate([FromQuery] int count = 25)
    {
        count = Math.Clamp(count, 1, 500);

        for (var i = 0; i < count; i++)
        {
            var user = Users[Rng.Next(Users.Length)];
            var order = Orders[Rng.Next(Orders.Length)];
            var durationMs = Rng.Next(5, 2000);

            switch (Rng.Next(0, 8))
            {
                case 0:
                    _logger.LogTrace("Cache lookup for key {CacheKey} took {DurationMs}ms", $"user:{user}", durationMs);
                    break;
                case 1:
                    _logger.LogDebug("Processing order {OrderId} for user {User}", order, user);
                    break;
                case 2:
                case 3:
                    _logger.LogInformation("User {User} placed order {OrderId} worth {Amount:C}", user, order, Rng.Next(10, 500));
                    break;
                case 4:
                    _logger.LogWarning("Order {OrderId} for {User} is taking longer than expected ({DurationMs}ms)", order, user, durationMs);
                    break;
                case 5:
                    try
                    {
                        throw new InvalidOperationException($"Payment gateway timeout for order {order}");
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, "Payment failed for order {OrderId} and user {User}", order, user);
                    }
                    break;
                case 6:
                    try
                    {
                        throw new ApplicationException($"Unhandled exception while shipping {order}");
                    }
                    catch (Exception ex)
                    {
                        _logger.LogCritical(ex, "Fatal error shipping order {OrderId}", order);
                    }
                    break;
                default:
                    _logger.LogInformation("Health check ok at {CheckedAt}", DateTimeOffset.UtcNow);
                    break;
            }
        }

        return Ok(new { generated = count });
    }
}