@@ -2,8 +2,8 @@ defmodule GRPC.Client.Interceptors.Logger do
2
2
@ moduledoc """
3
3
Print log around client rpc calls, like
4
4
5
- 17:13:33.021 [info] Call say_hello of helloworld.Greeter
6
- 17:13:33.079 [info ] Got :ok in 58ms
5
+ 17:13:33.021 [info] Call helloworld.Greeter.say_hello -> :ok (58 ms)
6
+ 17:13:33.021 [error ] Call helloworld.Greeter.say_hello -> %GRPC.RPCError{status: 3, message: "Invalid argument"} (58 ms)
7
7
8
8
## Options
9
9
@@ -18,42 +18,87 @@ defmodule GRPC.Client.Interceptors.Logger do
18
18
{:ok, channel} = GRPC.Stub.connect("localhost:50051", interceptors: [{GRPC.Client.Interceptors.Logger, level: :warning}])
19
19
"""
20
20
21
- require Logger
22
-
23
21
@ behaviour GRPC.Client.Interceptor
24
22
25
- @ impl true
23
+ require Logger
24
+
25
+ @ impl GRPC.Client.Interceptor
26
26
def init ( opts ) do
27
27
level = Keyword . get ( opts , :level ) || :info
28
28
[ level: level ]
29
29
end
30
30
31
- @ impl true
31
+ @ impl GRPC.Client.Interceptor
32
32
def call ( % { grpc_type: grpc_type } = stream , req , next , opts ) do
33
33
level = Keyword . fetch! ( opts , :level )
34
34
35
35
if Logger . compare_levels ( level , Logger . level ( ) ) != :lt do
36
- Logger . log ( level , fn ->
37
- [ "Call " , to_string ( elem ( stream . rpc , 0 ) ) , " of " , stream . service_name ]
38
- end )
39
-
40
36
start = System . monotonic_time ( )
41
- result = next . ( stream , req )
42
- stop = System . monotonic_time ( )
43
37
44
- if grpc_type == :unary do
45
- status = elem ( result , 0 )
38
+ try do
39
+ result = next . ( stream , req )
40
+ stop = System . monotonic_time ( )
46
41
47
- Logger . log ( level , fn ->
48
- diff = System . convert_time_unit ( stop - start , :native , :microsecond )
42
+ log_result ( result , level , grpc_type , stream , start , stop )
43
+ result
44
+ rescue
45
+ error in GRPC.RPCError ->
46
+ stop = System . monotonic_time ( )
47
+ log_error ( error , stream , start , stop )
49
48
50
- [ "Got " , inspect ( status ) , " in " , GRPC.Server.Interceptors.Logger . formatted_diff ( diff ) ]
51
- end )
49
+ reraise error , __STACKTRACE__
52
50
end
53
-
54
- result
55
51
else
56
52
next . ( stream , req )
57
53
end
58
54
end
55
+
56
+ defp log_error ( error , stream , start , stop ) do
57
+ diff = System . convert_time_unit ( stop - start , :native , :microsecond )
58
+
59
+ Logger . log ( :error , fn ->
60
+ [
61
+ "Call " ,
62
+ stream . service_name ,
63
+ "." ,
64
+ to_string ( elem ( stream . rpc , 0 ) ) ,
65
+ " -> " ,
66
+ inspect ( error ) ,
67
+ " (" ,
68
+ formatted_diff ( diff ) ,
69
+ ")"
70
+ ]
71
+ end )
72
+ end
73
+
74
+ defp log_result ( result , level , grpc_type , stream , start , stop ) do
75
+ case grpc_type do
76
+ :unary ->
77
+ status = elem ( result , 0 )
78
+
79
+ diff = System . convert_time_unit ( stop - start , :native , :microsecond )
80
+
81
+ Logger . log ( level , fn ->
82
+ [
83
+ "Call " ,
84
+ stream . service_name ,
85
+ "." ,
86
+ to_string ( elem ( stream . rpc , 0 ) ) ,
87
+ " -> " ,
88
+ inspect ( status ) ,
89
+ " (" ,
90
+ formatted_diff ( diff ) ,
91
+ ")"
92
+ ]
93
+ end )
94
+
95
+ _otherwise ->
96
+ Logger . log ( level , fn ->
97
+ [ "Call " , to_string ( elem ( stream . rpc , 0 ) ) , " of " , stream . service_name ]
98
+ end )
99
+ end
100
+ end
101
+
102
+ def formatted_diff ( diff ) when diff > 1000 , do: [ diff |> div ( 1000 ) |> Integer . to_string ( ) , "ms" ]
103
+ def formatted_diff ( diff ) , do: [ Integer . to_string ( diff ) , "µs" ]
59
104
end
0 commit comments