@@ -14,7 +14,7 @@ import (
1414 "github.com/thoas/go-funk"
1515)
1616
17- func resolveColumn (ctx context.Context , logger zerolog.Logger , m * metrics.Metrics , selector metrics.Selector , client schema.ClientMeta , resource * schema.Resource , column schema.Column , c * caser.Caser ) {
17+ func resolveColumn (ctx context.Context , logger zerolog.Logger , m * metrics.Metrics , selector metrics.Selector , client schema.ClientMeta , resource * schema.Resource , column schema.Column , c * caser.Caser , classifier schema. ErrorClassifier ) {
1818 columnStartTime := time .Now ()
1919 defer func () {
2020 if err := recover (); err != nil {
@@ -29,25 +29,38 @@ func resolveColumn(ctx context.Context, logger zerolog.Logger, m *metrics.Metric
2929 }
3030 }()
3131
32+ handleErr := func (err error ) {
33+ event := schema.ErrorEvent {Table : resource .Table , Client : client , Phase : schema .ErrorPhaseColumnResolver , Column : & column }
34+ if classifier .Suppress (ctx , err , event ) {
35+ logger .Debug ().Str ("column" , column .Name ).Err (err ).Msg ("column resolver finished with suppressed error" )
36+ return
37+ }
38+ logger .Error ().Err (err ).Msg ("column resolver finished with error" )
39+ m .AddErrors (ctx , 1 , selector )
40+ }
41+
3242 if column .Resolver != nil {
3343 if err := column .Resolver (ctx , client , resource , column ); err != nil {
34- logger .Error ().Err (err ).Msg ("column resolver finished with error" )
35- m .AddErrors (ctx , 1 , selector )
44+ handleErr (err )
3645 }
3746 } else {
3847 // base use case: try to get column with CamelCase name
3948 v := funk .Get (resource .GetItem (), c .ToPascal (column .Name ), funk .WithAllowZero ())
4049 if v != nil {
41- err := resource .Set (column .Name , v )
42- if err != nil {
43- logger .Error ().Err (err ).Msg ("column resolver finished with error" )
44- m .AddErrors (ctx , 1 , selector )
50+ if err := resource .Set (column .Name , v ); err != nil {
51+ handleErr (err )
4552 }
4653 }
4754 }
4855}
4956
57+ // Deprecated: use ResolveResourcesChunkWithClassifier. This retains the original
58+ // signature and resolves with a nil classifier, so every error is raised.
5059func ResolveResourcesChunk (ctx context.Context , logger zerolog.Logger , m * metrics.Metrics , table * schema.Table , client schema.ClientMeta , parent * schema.Resource , chunk []any , c * caser.Caser ) []* schema.Resource {
60+ return ResolveResourcesChunkWithClassifier (ctx , logger , m , table , client , parent , chunk , c , nil )
61+ }
62+
63+ func ResolveResourcesChunkWithClassifier (ctx context.Context , logger zerolog.Logger , m * metrics.Metrics , table * schema.Table , client schema.ClientMeta , parent * schema.Resource , chunk []any , c * caser.Caser , classifier schema.ErrorClassifier ) []* schema.Resource {
5164 ctx , cancel := context .WithTimeout (ctx , 10 * time .Minute )
5265 defer cancel ()
5366
@@ -72,8 +85,13 @@ func ResolveResourcesChunk(ctx context.Context, logger zerolog.Logger, m *metric
7285
7386 if table .PreResourceChunkResolver != nil {
7487 if err := table .PreResourceChunkResolver .RowsResolver (ctx , client , resources ); err != nil {
75- tableLogger .Error ().Stack ().Err (err ).Msg ("pre resource chunk resolver finished with error" )
76- m .AddErrors (ctx , 1 , selector )
88+ event := schema.ErrorEvent {Table : table , Client : client , Phase : schema .ErrorPhasePreResourceChunkResolver }
89+ if classifier .Suppress (ctx , err , event ) {
90+ tableLogger .Debug ().Err (err ).Msg ("pre resource chunk resolver finished with suppressed error" )
91+ } else {
92+ tableLogger .Error ().Stack ().Err (err ).Msg ("pre resource chunk resolver finished with error" )
93+ m .AddErrors (ctx , 1 , selector )
94+ }
7795 return nil
7896 }
7997 }
@@ -82,30 +100,45 @@ func ResolveResourcesChunk(ctx context.Context, logger zerolog.Logger, m *metric
82100 filtered := resources [:0 ]
83101 for _ , resource := range resources {
84102 if err := table .PreResourceResolver (ctx , client , resource ); err != nil {
85- if ctx .Err () != nil {
103+ event := schema.ErrorEvent {Table : table , Client : client , Phase : schema .ErrorPhasePreResourceResolver }
104+ suppress := classifier .Suppress (ctx , err , event )
105+ switch {
106+ case suppress && ctx .Err () != nil :
107+ tableLogger .Debug ().Err (err ).Msg ("pre resource resolver failed, context cancelled (suppressed)" )
108+ return nil
109+ case suppress :
110+ tableLogger .Debug ().Err (err ).Msg ("pre resource resolver failed (suppressed)" )
111+ continue
112+ case ctx .Err () != nil :
86113 tableLogger .Error ().Err (err ).Msg ("pre resource resolver failed, context cancelled" )
87114 m .AddErrors (ctx , 1 , selector )
88115 return nil
116+ default :
117+ tableLogger .Error ().Err (err ).Msg ("pre resource resolver failed" )
118+ m .AddErrors (ctx , 1 , selector )
119+ continue
89120 }
90- tableLogger .Error ().Err (err ).Msg ("pre resource resolver failed" )
91- m .AddErrors (ctx , 1 , selector )
92- continue
93121 }
94122 filtered = append (filtered , resource )
95123 }
96124 resources = filtered
97125 }
98126 for _ , resource := range resources {
99127 for _ , column := range table .Columns {
100- resolveColumn (ctx , tableLogger , m , selector , client , resource , column , c )
128+ resolveColumn (ctx , tableLogger , m , selector , client , resource , column , c , classifier )
101129 }
102130 }
103131
104132 if table .PostResourceResolver != nil {
105133 for _ , resource := range resources {
106134 if err := table .PostResourceResolver (ctx , client , resource ); err != nil {
107- tableLogger .Error ().Stack ().Err (err ).Msg ("post resource resolver finished with error" )
108- m .AddErrors (ctx , 1 , selector )
135+ event := schema.ErrorEvent {Table : table , Client : client , Phase : schema .ErrorPhasePostResourceResolver }
136+ if classifier .Suppress (ctx , err , event ) {
137+ tableLogger .Debug ().Err (err ).Msg ("post resource resolver finished with suppressed error" )
138+ } else {
139+ tableLogger .Error ().Stack ().Err (err ).Msg ("post resource resolver finished with error" )
140+ m .AddErrors (ctx , 1 , selector )
141+ }
109142 }
110143 }
111144 }
0 commit comments