2222import co .elastic .apm .agent .util .Version ;
2323import com .dslplatform .json .DslJson ;
2424import com .dslplatform .json .JsonReader ;
25- import com .dslplatform .json .MapConverter ;
2625import com .dslplatform .json .Nullable ;
2726import com .dslplatform .json .ObjectConverter ;
2827import org .slf4j .Logger ;
2928import org .slf4j .LoggerFactory ;
3029
3130import java .net .HttpURLConnection ;
3231import java .util .Collections ;
32+ import java .util .LinkedHashMap ;
3333import java .util .List ;
3434import java .util .Map ;
35+ import java .util .Objects ;
3536import java .util .concurrent .Callable ;
3637import java .util .concurrent .Future ;
3738import java .util .concurrent .ThreadPoolExecutor ;
4142public class ApmServerHealthChecker implements Callable <Version > {
4243 private static final Logger logger = LoggerFactory .getLogger (ApmServerHealthChecker .class );
4344
45+ private static final DslJson <Object > dslJson = new DslJson <>(new DslJson .Settings <>());
46+
4447 private final ApmServerClient apmServerClient ;
45- private final DslJson <Object > dslJson = new DslJson <>(new DslJson .Settings <>());
4648
4749 public ApmServerHealthChecker (ApmServerClient apmServerClient ) {
4850 this .apmServerClient = apmServerClient ;
@@ -81,24 +83,11 @@ public Version withConnection(HttpURLConnection connection) {
8183 // prints out the version info of the APM Server
8284 String body = HttpUtils .readToString (connection .getInputStream ());
8385 logger .info ("Elastic APM server is available: {}" , body );
84- JsonReader <Object > reader = dslJson .newReader (body .getBytes (UTF_8 ));
85- reader .startObject ();
86- String versionString ;
87- try {
88- // newer APM server versions contain a flat map at the JSON root
89- versionString = MapConverter .deserialize (reader ).get ("version" );
90- } catch (Exception e ) {
91- // 6.x APM server versions' JSON has a root object of which value is the same map
92- reader = dslJson .newReader (body .getBytes (UTF_8 ));
93- reader .startObject ();
94- Map <String , Object > root = ObjectConverter .deserializeMap (reader );
95- //noinspection unchecked
96- versionString = ((Map <String , String >) root .get ("ok" )).get ("version" );
97- }
86+ Version version = parseVersion (body );
9887 if (logger .isDebugEnabled ()) {
99- logger .debug ("APM server {} version is: {}" , connection .getURL (), versionString );
88+ logger .debug ("APM server {} version is: {}" , connection .getURL (), version );
10089 }
101- return Version . of ( versionString ) ;
90+ return version ;
10291 } catch (Exception e ) {
10392 logger .warn ("Failed to parse version of APM server {}: {}" , connection .getURL (), e .getMessage ());
10493 }
@@ -115,4 +104,23 @@ public Version withConnection(HttpURLConnection connection) {
115104 }
116105 return Version .UNKNOWN_VERSION ;
117106 }
107+
108+ static Version parseVersion (String body ) throws java .io .IOException {
109+ JsonReader <Object > reader = dslJson .newReader (body .getBytes (UTF_8 ));
110+ reader .startObject ();
111+ String versionString ;
112+ try {
113+ // APM server 7.0+ contain a flat map at the JSON root
114+ LinkedHashMap <String , Object > responseJsonMap = ObjectConverter .deserializeMap (reader );
115+ versionString = (String ) Objects .requireNonNull (responseJsonMap .get ("version" ));
116+ } catch (Exception e ) {
117+ // 6.x APM server versions' JSON has a root object of which value is the same map
118+ reader = dslJson .newReader (body .getBytes (UTF_8 ));
119+ reader .startObject ();
120+ Map <String , Object > root = ObjectConverter .deserializeMap (reader );
121+ //noinspection unchecked
122+ versionString = ((Map <String , String >) root .get ("ok" )).get ("version" );
123+ }
124+ return Version .of (versionString );
125+ }
118126}
0 commit comments