File size: 2,736 Bytes
478d5b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
115
116
117
118
119
120
121
import { auth } from '@/auth';
import { Session } from 'next-auth';

import { pino, Logger as LokiLogger } from 'pino';
import pinoLoki from 'pino-loki';

let loggerInstance: Logger;

class Logger {
  private lokiLogger!: LokiLogger;

  constructor() {
    if (loggerInstance) {
      return loggerInstance;
    }
    this.lokiLogger = pino(
      { level: 'info' },
      pinoLoki({
        batching: false,

        // These labels will be added to every log
        labels: {
          app: 'grafanacloud-landingai-logs',
          namespace: 'vision-agent',
        },

        // Credentials for our Loki instance
        host: 'https://logs-prod3.grafana.net',
        basicAuth: {
          username: process.env.LOKI_AUTH_USER_ID!,
          password: process.env.LOKI_AUTH_USER_PASSWORD!,
        },
      }),
    );
    this.lokiLogger.debug('test');
    loggerInstance = this;
    return loggerInstance;
  }

  private createLogMessage(
    request: Request,
    message: Object | string,
    session: Session | null,
    logDescription?: string,
  ) {
    const body = {
      type: logDescription || '__DEFAULT',
      context: {
        method: request.method,
        url: request.url,
        sessionUserId: session?.user.id,
        sessionUserName: session?.user.name,
        sessionUserEmail: session?.user.email,
      },
      message: message,
    };
    return body;
  }

  info(
    request: Request,
    session: Session | null,
    message: string | Object,
    logDescription?: string,
  ) {
    this.lokiLogger.info(
      this.createLogMessage(request, message, session, logDescription),
    );
  }
  warn(
    request: Request,
    session: Session | null,
    message: string | Object,
    logDescription?: string,
  ) {
    this.lokiLogger.warn(
      this.createLogMessage(request, message, session, logDescription),
    );
  }
  debug(
    request: Request,
    session: Session | null,
    message: string | Object,
    logDescription?: string,
  ) {
    this.lokiLogger.debug(
      this.createLogMessage(request, message, session, logDescription),
    );
  }
  error(
    request: Request,
    session: Session | null,
    message: string | Object,
    logDescription?: string,
  ) {
    this.lokiLogger.error(
      this.createLogMessage(request, message, session, logDescription),
    );
  }
}

export const withLogging = (
  handler: (session: Session | null, json: any) => Promise<Response>,
) => {
  return async (req: Request) => {
    const session = await auth();
    const json = await req.json();
    logger.info(
      req,
      session,
      {
        params: json,
      },
      '_API_REQUEST',
    );
    return handler(session, json);
  };
};

export const logger = new Logger();