4646import com .tencent .qcloud .core .http .HttpRequest ;
4747import com .tencent .qcloud .core .http .HttpTask ;
4848import com .tencent .qcloud .core .http .HttpTaskMetrics ;
49- import com .tencent .qcloud .network .sonar .NetworkSonar ;
50- import com .tencent .qcloud .network .sonar .NetworkSonarCallback ;
51- import com .tencent .qcloud .network .sonar .SonarRequest ;
52- import com .tencent .qcloud .network .sonar .SonarResult ;
53- import com .tencent .qcloud .network .sonar .SonarType ;
54- import com .tencent .qcloud .network .sonar .dns .DnsResult ;
55- import com .tencent .qcloud .network .sonar .ping .PingResult ;
56- import com .tencent .qcloud .network .sonar .traceroute .TracerouteResult ;
5749import com .tencent .qcloud .track .Constants ;
5850import com .tencent .qcloud .track .QCloudTrackService ;
5951import com .tencent .qcloud .track .cls .ClsLifecycleCredentialProvider ;
6052import com .tencent .qcloud .track .service .BeaconTrackService ;
6153import com .tencent .qcloud .track .service .ClsTrackService ;
6254
6355import java .io .IOException ;
64- import java .net .InetAddress ;
65- import java .util .ArrayList ;
6656import java .util .Collections ;
6757import java .util .HashMap ;
6858import java .util .LinkedList ;
6959import java .util .List ;
7060import java .util .Locale ;
7161import java .util .Map ;
7262import java .util .Random ;
73- import java .util .concurrent .Executors ;
74- import java .util .concurrent .ScheduledExecutorService ;
75- import java .util .concurrent .TimeUnit ;
7663import java .util .regex .Matcher ;
7764import java .util .regex .Pattern ;
7865
@@ -92,9 +79,9 @@ public class CosTrackService {
9279 // 网络事件
9380 private static final String EVENT_CODE_TRACK_COS_SDK_HTTP = "qcloud_track_cos_sdk_http" ;
9481 // 常规网络探测事件
95- private static final String EVENT_CODE_TRACK_COS_SDK_SONAR = "qcloud_track_cos_sdk_sonar" ;
82+ public static final String EVENT_CODE_TRACK_COS_SDK_SONAR = "qcloud_track_cos_sdk_sonar" ;
9683 // 错误网络探测事件
97- private static final String EVENT_CODE_TRACK_COS_SDK_SONAR_FAILURE = "qcloud_track_cos_sdk_sonar_failure" ;
84+ public static final String EVENT_CODE_TRACK_COS_SDK_SONAR_FAILURE = "qcloud_track_cos_sdk_sonar_failure" ;
9885 private static final String EVENT_CODE_NEW_TRANSFER = "qcloud_track_cos_sdk_transfer" ;
9986
10087 private static final String EVENT_PARAMS_SUCCESS = "Success" ;
@@ -105,12 +92,19 @@ public class CosTrackService {
10592 private static CosTrackService instance ;
10693 //上报桥接来源
10794 private String bridge ;
108- private Context applicationContext ;
10995 private boolean isCloseReport ;
96+ public boolean isCloseReport () {
97+ return isCloseReport ;
98+ }
11099
111- // 常规探测
112- private final ScheduledExecutorService sonarScheduler = Executors .newScheduledThreadPool (1 );
113- private final SonarHostsRandomQueue sonarHosts = new SonarHostsRandomQueue (3 );
100+ private final CosTrackSonarService sonarService = new CosTrackSonarService ();
101+ public CosTrackSonarService getSonarService () {
102+ return sonarService ;
103+ }
104+ private final CosTrackService .SonarHostsRandomQueue sonarHosts = new CosTrackService .SonarHostsRandomQueue (3 );
105+ public SonarHostsRandomQueue getSonarHosts () {
106+ return sonarHosts ;
107+ }
114108
115109 private CosTrackService () {
116110 }
@@ -123,7 +117,6 @@ public static void init(Context applicationContext, boolean isCloseReport, Strin
123117 if (instance == null ) {
124118 instance = new CosTrackService ();
125119 instance .bridge = bridge ;
126- instance .applicationContext = applicationContext ;
127120 instance .isCloseReport = isCloseReport ;
128121 if (BeaconTrackService .isInclude ()) {
129122 // 添加全部上报灯塔上报器
@@ -152,7 +145,8 @@ public static void init(Context applicationContext, boolean isCloseReport, Strin
152145 QCloudTrackService .getInstance ().setIsCloseReport (isCloseReport );
153146
154147 CosTrackService .getInstance ().reportSdkStart ();
155- CosTrackService .getInstance ().periodicSonar ();
148+ CosTrackService .getInstance ().getSonarService ().setContext (applicationContext );
149+ CosTrackService .getInstance ().getSonarService ().periodicSonar ();
156150
157151// if (BeaconTrackService.isInclude()) {
158152// // 获取灯塔云控配置,决定是否要initBeacon
@@ -316,121 +310,6 @@ public void reportHttpMetrics(CosXmlRequest request) {
316310 }
317311 }
318312
319- private void periodicSonar (){
320- final Runnable sonar = () -> {
321- SonarHost sonarHost = sonarHosts .get ();
322- if (sonarHost == null || sonarHost .getHost () == null ) return ;
323-
324- long diffInMinutes = (System .currentTimeMillis () - sonarHosts .getSonarHostsAddTimestamp ()) / (1000 * 60 );
325- // 检查是否超过了15分钟
326- if (diffInMinutes > 15 ) return ;
327-
328- Map <String , String > extra = new HashMap <>();
329- extra .put ("region" , sonarHost .getRegion ());
330- extra .put ("bucket" , sonarHost .getBucket ());
331- sonar (EVENT_CODE_TRACK_COS_SDK_SONAR , sonarHost .getHost (), extra , true );
332- };
333- // 探测策略:起始延迟3分钟,每10分钟执行一次
334- sonarScheduler .scheduleWithFixedDelay (sonar , 3 , 10 , TimeUnit .MINUTES );
335- }
336-
337-
338- public void failSonar (String host , String region , String bucket , String clientTraceId ){
339- if (host == null ) return ;
340- Map <String , String > extra = new HashMap <>();
341- extra .put ("region" , region );
342- extra .put ("bucket" , bucket );
343- extra .put ("client_trace_id" , clientTraceId );
344- sonar (EVENT_CODE_TRACK_COS_SDK_SONAR_FAILURE , host , extra , false );
345- }
346-
347- private void sonar (String eventCode , String host , Map <String , String > extra , boolean periodic ){
348- // 不做无谓的探测
349- if (instance .isCloseReport || !BeaconTrackService .isInclude ()) {
350- return ;
351- }
352-
353- try {
354- Map <String , String > params = new HashMap <>(extra );
355- params .put ("host" , host );
356-
357- SonarRequest sonarRequest ;
358- List <SonarType > types = new ArrayList <>();
359- if (periodic ){
360- types .add (SonarType .PING );
361- long startTime = System .currentTimeMillis ();
362- InetAddress address = InetAddress .getByName (host );
363- String dnsIp = address .getHostAddress ();
364- params .put ("dns_ip" , dnsIp );
365- params .put ("dns_lookupTime" , String .valueOf (System .currentTimeMillis () - startTime ));
366- sonarRequest = new SonarRequest (host , dnsIp );
367- } else {
368- types .add (SonarType .DNS );
369- types .add (SonarType .PING );
370- types .add (SonarType .TRACEROUTE );
371- sonarRequest = new SonarRequest (host );
372- }
373- NetworkSonar .sonar (applicationContext , sonarRequest , types , new NetworkSonarCallback () {
374- @ Override
375- public void onSuccess (SonarResult result ) {
376- }
377-
378- @ Override
379- public void onFail (SonarResult result ) {
380- }
381-
382- @ Override
383- public void onFinish (List <SonarResult > results ) {
384- if (results != null && !results .isEmpty ()){
385- for (SonarResult sonarResult : results ){
386- if (sonarResult == null || !sonarResult .isSuccess () || sonarResult .getResult () == null ) continue ;
387- switch (sonarResult .getType ()) {
388- case DNS :
389- DnsResult dnsResult = (DnsResult ) sonarResult .getResult ();
390- params .put ("dns_ip" , dnsResult .ip );
391- params .put ("dns_lookupTime" , String .valueOf (dnsResult .lookupTime ));
392- params .put ("dns_a" , dnsResult .a );
393- params .put ("dns_cname" , dnsResult .cname );
394- params .put ("dns_result" , dnsResult .response );
395- break ;
396- case PING :
397- PingResult pingResult = (PingResult ) sonarResult .getResult ();
398- params .put ("ping_ip" , pingResult .ip );
399- params .put ("ping_size" , String .valueOf (pingResult .size ));
400- params .put ("ping_interval" , String .valueOf (pingResult .interval ));
401- params .put ("ping_count" , String .valueOf (pingResult .count ));
402- params .put ("ping_loss" , String .valueOf (pingResult .getLoss ()));
403- params .put ("ping_response_num" , String .valueOf (pingResult .getResponseNum ()));
404- params .put ("ping_avg" , String .valueOf (pingResult .avg ));
405- params .put ("ping_max" , String .valueOf (pingResult .max ));
406- params .put ("ping_min" , String .valueOf (pingResult .min ));
407- params .put ("ping_stddev" , String .valueOf (pingResult .stddev ));
408- break ;
409- case TRACEROUTE :
410- TracerouteResult tracerouteResult = (TracerouteResult ) sonarResult .getResult ();
411- params .put ("traceroute_ip" , tracerouteResult .getTargetIp ());
412- params .put ("traceroute_status" , tracerouteResult .getCommandStatus ().getName ());
413- params .put ("traceroute_hop_count" , String .valueOf (tracerouteResult .getHopCount ()));
414- params .put ("traceroute_total_delay" , String .valueOf (tracerouteResult .getTotalDelay ()));
415- params .put ("traceroute_avg_loss_rate" , String .valueOf (tracerouteResult .getLossRate ()));
416- params .put ("traceroute_nodes" , tracerouteResult .getNodeResultsString ());
417- break ;
418- }
419- }
420- // 至少探测到一种网络情况才上报
421- if (params .containsKey ("dns_ip" ) || params .containsKey ("ping_ip" ) || params .containsKey ("traceroute_ip" )){
422- QCloudTrackService .getInstance ().report (eventCode , params );
423- }
424- }
425- }
426- });
427- } catch (Exception e ) {
428- if (IS_DEBUG ) {
429- e .printStackTrace ();
430- }
431- }
432- }
433-
434313 /**
435314 * 上报base_service事件 成功
436315 *
@@ -638,12 +517,14 @@ private CosXmlClientException reportClientException(CosXmlRequest request, QClou
638517 // 客户端网络异常sonar
639518 if (returnClientException .exception .errorCode == ClientErrorCode .POOR_NETWORK .getCode () ||
640519 returnClientException .exception .errorCode == ClientErrorCode .IO_ERROR .getCode ()){
641- failSonar (
642- params .get ("host" ),
643- params .get ("region" ),
644- params .get ("bucket" ),
645- request .getClientTraceId ()
646- );
520+ if (sonarService != null ){
521+ sonarService .failSonar (
522+ params .get ("host" ),
523+ params .get ("region" ),
524+ params .get ("bucket" ),
525+ request .getClientTraceId ()
526+ );
527+ }
647528 }
648529 }
649530 } catch (Exception e ) {
@@ -688,12 +569,14 @@ private CosXmlServiceException reportServiceException(CosXmlRequest request, QCl
688569 // 服务端网络异常sonar
689570 if (returnServiceException .exception != null && ("RequestTimeout" .equals (returnServiceException .exception .getErrorCode ()) ||
690571 "UserNetworkTooSlow" .equals (returnServiceException .exception .getErrorCode ()))){
691- failSonar (
572+ if (sonarService != null ){
573+ sonarService .failSonar (
692574 params .get ("host" ),
693575 params .get ("region" ),
694576 params .get ("bucket" ),
695577 request .getClientTraceId ()
696- );
578+ );
579+ }
697580 }
698581 }
699582 } catch (Exception e ){
@@ -967,7 +850,7 @@ private boolean isReport(CosXmlClientException e) {
967850 return !notReport ;
968851 }
969852
970- private static class SonarHostsRandomQueue {
853+ public static class SonarHostsRandomQueue {
971854 private final List <SonarHost > list ;
972855 private final int maxSize ;
973856 private final Random random ;
@@ -1003,7 +886,7 @@ public SonarHost get() {
1003886 }
1004887 }
1005888
1006- private static class SonarHost {
889+ public static class SonarHost {
1007890 private final String host ;
1008891 private final String region ;
1009892 private final String bucket ;
0 commit comments