2626import com .tencent .polaris .api .plugin .circuitbreaker .entity .Resource ;
2727import com .tencent .polaris .api .plugin .common .PluginTypes ;
2828import com .tencent .polaris .api .plugin .compose .Extensions ;
29- import com .tencent .polaris .api .plugin .event .FlowEvent ;
30- import com .tencent .polaris .api .plugin .event .FlowEventConstants ;
3129import com .tencent .polaris .api .plugin .stat .DefaultCircuitBreakResult ;
3230import com .tencent .polaris .api .plugin .stat .StatInfo ;
3331import com .tencent .polaris .api .plugin .stat .StatReporter ;
34- import com .tencent .polaris .api .pojo .* ;
32+ import com .tencent .polaris .api .pojo .CircuitBreakerStatus ;
3533import com .tencent .polaris .api .pojo .CircuitBreakerStatus .FallbackInfo ;
3634import com .tencent .polaris .api .pojo .CircuitBreakerStatus .Status ;
37- import com .tencent .polaris .api .utils .CollectionUtils ;
35+ import com .tencent .polaris .api .pojo .HalfOpenStatus ;
36+ import com .tencent .polaris .api .pojo .RetStatus ;
37+ import com .tencent .polaris .api .pojo .TrieNode ;
3838import com .tencent .polaris .api .utils .StringUtils ;
3939import com .tencent .polaris .api .utils .TrieUtil ;
40- import com .tencent .polaris .client .flow .BaseFlow ;
4140import com .tencent .polaris .logging .LoggerFactory ;
4241import com .tencent .polaris .plugins .circuitbreaker .composite .trigger .ConsecutiveCounter ;
4342import com .tencent .polaris .plugins .circuitbreaker .composite .trigger .CounterOptions ;
4443import com .tencent .polaris .plugins .circuitbreaker .composite .trigger .ErrRateCounter ;
4544import com .tencent .polaris .plugins .circuitbreaker .composite .trigger .TriggerCounter ;
45+ import com .tencent .polaris .plugins .circuitbreaker .composite .utils .CircuitBreakerEventUtils ;
4646import com .tencent .polaris .plugins .circuitbreaker .composite .utils .CircuitBreakerUtils ;
4747import com .tencent .polaris .specification .api .v1 .fault .tolerance .CircuitBreakerProto ;
4848import com .tencent .polaris .specification .api .v1 .fault .tolerance .CircuitBreakerProto .*;
4949import org .slf4j .Logger ;
5050
51- import java .time .LocalDateTime ;
5251import java .util .*;
5352import java .util .concurrent .ScheduledExecutorService ;
5453import java .util .concurrent .TimeUnit ;
5857import java .util .regex .Pattern ;
5958
6059import static com .tencent .polaris .api .plugin .cache .CacheConstants .API_ID ;
61- import static com .tencent .polaris .api .plugin .event .tsf .TsfEventDataConstants .*;
6260import static com .tencent .polaris .logging .LoggingConsts .LOGGING_CIRCUIT_BREAKER ;
6361
6462/**
@@ -204,7 +202,8 @@ private void toOpen(CircuitBreakerStatus preStatus, String circuitBreaker, Strin
204202 CB_LOG .info ("previous status {}, current status {}, resource {}, rule {}" , preStatus .getStatus (),
205203 newStatus .getStatus (), resource , circuitBreaker );
206204 reportCircuitStatus ();
207- reportEvent (preStatus .getStatus (), newStatus .getStatus (), circuitBreaker , reason );
205+ CircuitBreakerEventUtils .reportEvent (extensions , resource , currentActiveRule ,
206+ preStatus .getStatus (), newStatus .getStatus (), circuitBreaker , reason );
208207 long sleepWindow = CircuitBreakerUtils .getSleepWindowMilli (currentActiveRule , circuitBreakerConfig );
209208 // add callback after timeout
210209 stateChangeExecutors .schedule (new Runnable () {
@@ -233,7 +232,8 @@ public void openToHalfOpen() {
233232 circuitBreakerStatus .getStatus (),
234233 halfOpenStatus .getStatus (), resource , circuitBreakerStatus .getCircuitBreaker ());
235234 circuitBreakerStatusReference .set (halfOpenStatus );
236- reportEvent (circuitBreakerStatus .getStatus (), halfOpenStatus .getStatus (), circuitBreakerStatus .getCircuitBreaker ());
235+ CircuitBreakerEventUtils .reportEvent (extensions , resource , currentActiveRule ,
236+ circuitBreakerStatus .getStatus (), halfOpenStatus .getStatus (), circuitBreakerStatus .getCircuitBreaker (), null );
237237 reportCircuitStatus ();
238238 }
239239 }
@@ -256,7 +256,8 @@ public void halfOpenToClose() {
256256 for (TriggerCounter triggerCounter : counters ) {
257257 triggerCounter .resume ();
258258 }
259- reportEvent (circuitBreakerStatus .getStatus (), newStatus .getStatus (), circuitBreakerStatus .getCircuitBreaker ());
259+ CircuitBreakerEventUtils .reportEvent (extensions , resource , currentActiveRule ,
260+ circuitBreakerStatus .getStatus (), newStatus .getStatus (), circuitBreakerStatus .getCircuitBreaker (), null );
260261 reportCircuitStatus ();
261262 }
262263 }
@@ -330,90 +331,6 @@ public CircuitBreakerStatus getCircuitBreakerStatus() {
330331 return circuitBreakerStatusReference .get ();
331332 }
332333
333- private void reportEvent (CircuitBreakerStatus .Status previousStatus , CircuitBreakerStatus .Status currentStatus , String ruleName ) {
334- reportEvent (previousStatus , currentStatus , ruleName , null );
335- }
336-
337- private void reportEvent (CircuitBreakerStatus .Status previousStatus , CircuitBreakerStatus .Status currentStatus ,
338- String ruleName , String reason ) {
339- if (extensions == null ) {
340- return ;
341- }
342-
343- FlowEventConstants .Status currentFlowEventStatus = CircuitBreakerUtils .parseFlowEventStatus (currentStatus );
344- FlowEventConstants .Status previousFlowEventStatus = CircuitBreakerUtils .parseFlowEventStatus (previousStatus );
345-
346- FlowEvent .Builder flowEventBuilder = new FlowEvent .Builder ()
347- .withEventType (ServiceEventKey .EventType .CIRCUIT_BREAKING )
348- .withEventName (CircuitBreakerUtils .parseFlowEventName (currentFlowEventStatus , previousFlowEventStatus ))
349- .withTimestamp (LocalDateTime .now ())
350- .withClientId (extensions .getValueContext ().getClientId ())
351- .withClientIp (extensions .getValueContext ().getHost ())
352- .withNamespace (resource .getService ().getNamespace ())
353- .withService (resource .getService ().getService ())
354- .withInstanceId (extensions .getValueContext ().getInstanceId ())
355- .withSourceNamespace (resource .getCallerService ().getNamespace ())
356- .withSourceService (resource .getService ().getService ())
357- .withCurrentStatus (currentFlowEventStatus )
358- .withPreviousStatus (previousFlowEventStatus )
359- .withRuleName (ruleName );
360- if (StringUtils .isNotBlank (reason )) {
361- flowEventBuilder .withReason (reason );
362- }
363- String isolationObject = "" ;
364- switch (resource .getLevel ()) {
365- case SERVICE :
366- flowEventBuilder = flowEventBuilder .withResourceType (FlowEventConstants .ResourceType .SERVICE );
367- isolationObject = CircuitBreakerUtils .getServiceCircuitBreakerName (
368- resource .getService ().getNamespace (), resource .getService ().getService ());
369- break ;
370- case METHOD :
371- MethodResource methodResource = (MethodResource ) resource ;
372- flowEventBuilder = flowEventBuilder .withResourceType (FlowEventConstants .ResourceType .METHOD )
373- .withApiProtocol (methodResource .getProtocol ())
374- .withApiPath (methodResource .getPath ())
375- .withApiMethod (methodResource .getMethod ());
376- isolationObject = CircuitBreakerUtils .getApiCircuitBreakerName (
377- methodResource .getService ().getNamespace (), methodResource .getService ().getService (),
378- methodResource .getPath (), methodResource .getMethod ());
379- break ;
380- case INSTANCE :
381- InstanceResource instanceResource = (InstanceResource ) resource ;
382- flowEventBuilder = flowEventBuilder .withResourceType (FlowEventConstants .ResourceType .INSTANCE )
383- .withHost (instanceResource .getHost ())
384- .withPort (instanceResource .getPort ());
385- isolationObject = CircuitBreakerUtils .getInstanceCircuitBreakerName (
386- instanceResource .getHost (), instanceResource .getPort ());
387- break ;
388- }
389-
390- FlowEvent flowEvent = flowEventBuilder .build ();
391-
392- String failureRate = "" ;
393- String slowCallRate = "" ;
394- if (CollectionUtils .isNotEmpty (currentActiveRule .getBlockConfigsList ())) {
395- for (BlockConfig blockConfig : currentActiveRule .getBlockConfigsList ()) {
396- if (CollectionUtils .isNotEmpty (blockConfig .getTriggerConditionsList ())) {
397- if (StringUtils .equals (blockConfig .getName (), "failure" )) {
398- failureRate = String .valueOf (blockConfig .getTriggerConditions (0 ).getErrorPercent ());
399- } else if (StringUtils .equals (blockConfig .getName (), "slow" )) {
400- slowCallRate = String .valueOf (blockConfig .getTriggerConditions (0 ).getErrorPercent ());
401- }
402- }
403- }
404- }
405- if (StringUtils .isNotBlank (isolationObject )) {
406- flowEvent .getAdditionalParams ().put (ISOLATION_OBJECT_KEY , isolationObject );
407- }
408- if (StringUtils .isNotBlank (failureRate )) {
409- flowEvent .getAdditionalParams ().put (FAILURE_RATE_KEY , failureRate );
410- }
411- if (StringUtils .isNotBlank (slowCallRate )) {
412- flowEvent .getAdditionalParams ().put (SLOW_CALL_DURATION_KEY , slowCallRate );
413- }
414- BaseFlow .reportFlowEvent (extensions , flowEvent );
415- }
416-
417334 public void reportCircuitStatus () {
418335 if (Objects .isNull (extensions )) {
419336 return ;
@@ -479,7 +396,8 @@ private void toDestroy() {
479396 for (TriggerCounter triggerCounter : counters ) {
480397 triggerCounter .resume ();
481398 }
482- reportEvent (circuitBreakerStatus .getStatus (), Status .DESTROY , circuitBreakerStatus .getCircuitBreaker ());
399+ CircuitBreakerEventUtils .reportEvent (extensions , resource , currentActiveRule ,
400+ circuitBreakerStatus .getStatus (), Status .CLOSE , circuitBreakerStatus .getCircuitBreaker (), null );
483401 reportCircuitStatus ();
484402 }
485403 }
0 commit comments