@@ -5,14 +5,16 @@ import {
5
5
resolveGlobalErrorLogObject ,
6
6
stringValueSerializer ,
7
7
} from '@lokalise/node-core'
8
+ import type { MakeRequired , MayOmit } from '@lokalise/universal-ts-utils/node'
8
9
import {
9
10
type HandlerSpy ,
10
11
type HandlerSpyParams ,
12
+ type MessageMetricsManager ,
11
13
type MessageProcessingResult ,
12
14
type PublicHandlerSpy ,
13
15
resolveHandlerSpy ,
14
16
} from '@message-queue-toolkit/core'
15
- import type { BaseOptions } from '@platformatic/kafka'
17
+ import type { BaseOptions , Message } from '@platformatic/kafka'
16
18
import type {
17
19
KafkaConfig ,
18
20
KafkaDependencies ,
@@ -34,20 +36,29 @@ export type BaseKafkaOptions = {
34
36
logMessages ?: boolean
35
37
} & Omit < BaseOptions , keyof KafkaConfig > // Exclude properties that are already in KafkaConfig
36
38
39
+ type ProcessedMessage = MayOmit <
40
+ Pick < Message < string , object , string , string > , 'topic' | 'value' | 'timestamp' > ,
41
+ 'timestamp'
42
+ >
43
+
37
44
export abstract class AbstractKafkaService <
38
45
TopicsConfig extends TopicConfig [ ] ,
39
46
KafkaOptions extends BaseKafkaOptions ,
40
47
> {
41
48
protected readonly errorReporter : ErrorReporter
42
49
protected readonly logger : CommonLogger
50
+ protected readonly messageMetricsManager ?: MessageMetricsManager <
51
+ SupportedMessageValues < TopicsConfig >
52
+ >
43
53
44
- protected readonly options : KafkaOptions
54
+ protected readonly options : MakeRequired < KafkaOptions , 'messageIdField' >
45
55
protected readonly _handlerSpy ?: HandlerSpy < SupportedMessageValues < TopicsConfig > >
46
56
47
57
constructor ( dependencies : KafkaDependencies , options : KafkaOptions ) {
48
58
this . logger = dependencies . logger
49
59
this . errorReporter = dependencies . errorReporter
50
- this . options = options
60
+ this . messageMetricsManager = dependencies . messageMetricsManager
61
+ this . options = { ...options , messageIdField : options . messageIdField ?? 'id' }
51
62
52
63
this . _handlerSpy = resolveHandlerSpy ( options )
53
64
}
@@ -65,40 +76,54 @@ export abstract class AbstractKafkaService<
65
76
66
77
protected resolveMessageType ( message : SupportedMessageValues < TopicsConfig > ) : string | undefined {
67
78
if ( ! this . options . messageTypeField ) return undefined
68
- return message [ this . options . messageTypeField ]
79
+ return message [ this . options . messageTypeField ] as string | undefined
69
80
}
70
81
71
82
protected resolveMessageId ( message : SupportedMessageValues < TopicsConfig > ) : string | undefined {
72
- if ( ! this . options . messageIdField ) return undefined
73
- return message [ this . options . messageIdField ]
83
+ // @ts -expect-error
84
+ return message [ this . options . messageIdField ] as string | undefined
74
85
}
75
86
76
87
protected resolveHeaderRequestIdField ( ) : string {
77
88
return this . options . headerRequestIdField ?? 'x-request-id'
78
89
}
79
90
80
91
protected handleMessageProcessed ( params : {
81
- message : SupportedMessageValues < TopicsConfig >
92
+ message : ProcessedMessage
82
93
processingResult : MessageProcessingResult
83
- topic : string
94
+ messageProcessingStartTimestamp : number
84
95
} ) {
85
- const { message, processingResult, topic } = params
86
- const messageId = this . resolveMessageId ( message )
96
+ const { message, processingResult } = params
97
+ const messageId = this . resolveMessageId ( message . value )
98
+ const messageType = this . resolveMessageType ( message . value )
87
99
88
- this . _handlerSpy ?. addProcessedMessage ( { message, processingResult } , messageId )
100
+ this . _handlerSpy ?. addProcessedMessage ( { message : message . value , processingResult } , messageId )
89
101
90
102
if ( this . options . logMessages ) {
91
103
this . logger . debug (
92
104
{
93
- message : stringValueSerializer ( message ) ,
94
- topic,
105
+ message : stringValueSerializer ( message . value ) ,
106
+ topic : message . topic ,
95
107
processingResult,
96
108
messageId,
97
- messageType : this . resolveMessageType ( message ) ,
109
+ messageType,
98
110
} ,
99
111
`Finished processing message ${ messageId } ` ,
100
112
)
101
113
}
114
+
115
+ if ( this . messageMetricsManager ) {
116
+ this . messageMetricsManager . registerProcessedMessage ( {
117
+ message : message . value ,
118
+ processingResult,
119
+ queueName : message . topic ,
120
+ messageId : messageId ?? 'unknown' ,
121
+ messageType : messageType ?? 'unknown' ,
122
+ messageTimestamp : message . timestamp ? Number ( message . timestamp ) : undefined ,
123
+ messageProcessingStartTimestamp : params . messageProcessingStartTimestamp ,
124
+ messageProcessingEndTimestamp : Date . now ( ) ,
125
+ } )
126
+ }
102
127
}
103
128
104
129
protected handlerError ( error : unknown , context : Record < string , unknown > = { } ) : void {
0 commit comments