6. Plugins
GHC can be extended for Resource-specific healthchecks via Plugins. GHC already comes with a set of standard plugins that may suffice most installations. However, there is no limit to detailed healthchecks one may want to perform. Hence developers can extend or even replace the GHC standard Plugins with custom implementations.
Two Plugin types exist that can be extended: the Probe and Check class. In v0.7.0 also plugins for Resource Authentication, ResourceAuth, were added and in v0.9.0 the geocoder plugin was introduced.
6.1. Concepts
GHC versions after May 1, 2017 perform healthchecks exclusively via Plugins (see Upgrade how to upgrade from older versions). The basic concept is simple: each Resource (typically an OWS endpoint) has one or more Probes. During a GHC run (via cron or manually), GHC sequentually invokes the Probes for each Resource to determine the health (QoS) of the Resource.
A Probe typically implements a single request like a WMS GetMap. A Probe contains and applies one or more Checks (the other Plugin class). A Check implements typically a single check on the HTTP Response object of its parent Probe, for example if the HTTP response has no errors or if a WMS GetMap actually returns an image (content-type check). Each Check will supply a CheckResult to its parent Probe. The list of CheckResults will then ultimately determine the ProbeResult. The Probe will in turn supply the ProbeResult to its parent ResourceResult. The GHC healthchecker will then determine the final outcome of the Run (fail/success) for the Resource, adding the list of Probe/CheckResults to the historic Run-data in the DB. This data can later be used for reporting and determining which Check(s) were failing.
So in summary: a Resource has one or more Probes, each Probe one or more Checks. On a GHC run these together provide a Result.
Probes and Checks available to the GHC instance are configured in config_site.py, the GHC instance config file. Also configured there is the default Probe class to assign to a Resource-type when it is added. Assignment and configuration/parameterization of Probes and Checks is via de UI on the Resource-edit page and stored in the database (tables: probe_vars and check_vars). That way the GHC healthcheck runner can read (from the DB) the list of Probes/Checks and their config for each Resource.
6.2. Implementation
Probes and Checks plugins are implemented as Python classes derived from
GeoHealthCheck.probe.Probe
and GeoHealthCheck.check.Check
respectively.
These classes inherit from the GHC abstract base class GeoHealthCheck.plugin.Plugin
.
This class mainly provides default attributes (in capitals) and introspection methods needed for
UI configuration. Class-attributes (in capitals) are the most important concept of GHC Plugins in general.
These provide metadata for various GHC functions (internal, UI etc). General class-attributes that
Plugin authors should provide for derived Probes or Checks are:
AUTHOR: Plugin author or team.
NAME: Short name of Plugin.
DESCRIPTION: Longer description of Plugin.
PARAM_DEFS: Plugin Parameter definitions (see next)
PARAM_DEFS, a Python dict defines the parameter definitions for the Probe or Check that a user can configure via the UI. Each parameter (name) is itself a dict entry key that with the following key/value pairs:
type: the parameter type, value: ‘string’, ‘stringlist’ (comma-separated strings) or ‘bbox’ (lowerX, lowerY, upperX, upperY),
description: description of the parameter,
default: parameter default value,
required: is parameter required?,
range: range of possible parameter values (array of strings), results in UI dropdown selector
A Probe should supply these additional class-attributes:
RESOURCE_TYPE : GHC Resource type this Probe applies to, e.g. OGC:WMS, *:* (any Resource Type), see enums.py for range
REQUEST_METHOD : HTTP request method capitalized, ‘GET’ (default) or ‘POST’.
REQUEST_HEADERS : dict of optional HTTP request headers
REQUEST_TEMPLATE: template in standard Python str.format(*args) to be substituted with actual parameters from PARAM_DEFS
CHECKS_AVAIL : available Check (classes) for this Probe.
Note: CHECKS_AVAIL denotes all possible Checks that can be assigned, by default or via UI, to an instance of this Probe.
A Check has no additional class-attributes.
In many cases writing a Probe is a matter of just defining the above class-attributes.
The GHC healthchecker GeoHealthCheck.healthcheck.run_test_resource()
will call lifecycle
methods of the GeoHealthCheck.probe.Probe
base class, using the class-attributes and actualized parameters (stored in probe_vars table)
as defined in PARAM_DEFS plus a list of the actual and parameterized Checks (stored in check_vars table) for its Probe instance.
More advanced
Probes can override base-class methods of Probe in particular GeoHealthCheck.probe.Probe.perform_request()
.
In that case the Probe-author should add one or more GeoHealthCheck.result.Result
objects
to self.result via self.result.add_result(result)
Writing a Check class requires providing the Plugin class-attributes (see above) including
optional PARAM_DEFS. The actual check is implemented by overriding the Check base class
method GeoHealthCheck.check.Check.perform()
, setting the check-result via
GeoHealthCheck.check.Check.set_result()
.
Finally your Probes and Checks need to be made available to your GHC instance via config_site.py and need to be found on the Python-PATH of your app.
The above may seem daunting at first. Examples below will hopefully make things clear as writing new Probes and Checks may sometimes be a matter of minutes!
TODO: may need VERSION variable class-attr to support upgrades
6.3. Examples
GHC includes Probes and Checks that on first setup are made available in config_site.py. By studying the the GHC standard Probes and Checks under the subdir GeoHealthCheck/plugins, Plugin-authors may get a feel how implementation can be effected.
There are broadly two ways to write a Probe:
using a REQUEST_* class-attributes, i.e. letting GHC do the Probe’s HTTP requests and checks
overriding
GeoHealthCheck.probe.Probe.perform_request()
: making your own requests
An example for each is provided, including the Checks used.
The simplest Probe is one that does:
an HTTP GET on a Resource URL
checks if the HTTP Response is not errored, i.e. a 404 or 500 status
optionally checks if the HTTP Response (not) contains expected strings
Below is the implementation of the class GeoHealthCheck.plugins.probe.http.HttpGet
:
1from GeoHealthCheck.probe import Probe
2
3
4class HttpGet(Probe):
5 """
6 Do HTTP GET Request, to poll/ping any Resource bare url.
7 """
8
9 NAME = 'HTTP GET Resource URL'
10 DESCRIPTION = 'Simple HTTP GET on Resource URL'
11 RESOURCE_TYPE = '*:*'
12 REQUEST_METHOD = 'GET'
13
14 CHECKS_AVAIL = {
15 'GeoHealthCheck.plugins.check.checks.HttpStatusNoError': {
16 'default': True
17 },
18 'GeoHealthCheck.plugins.check.checks.ContainsStrings': {},
19 'GeoHealthCheck.plugins.check.checks.NotContainsStrings': {},
20 'GeoHealthCheck.plugins.check.checks.HttpHasContentType': {}
21 }
22 """Checks avail"""
23
Yes, this is the entire implementation of GeoHealthCheck.plugins.probe.http.HttpGet
!
Only class-attributes are needed:
standard Plugin attributes: AUTHOR (‘GHC Team’ by default) NAME, DESCRIPTION
RESOURCE_TYPE = ‘*:*’ denotes that any Resource may use this Probe (UI lists this Probe under “Probes Available” for Resource)
REQUEST_METHOD = ‘GET’ : GHC should use the HTTP GET request method
CHECKS_AVAIL : all Check classes that can be applied to this Probe (UI lists these under “Checks Available” for Probe)
By setting:
'GeoHealthCheck.plugins.check.checks.HttpStatusNoError': {
'default': True
},
that Check is automatically assigned to this Probe when created. The other Checks may be added and configured via the UI.
Next look at the Checks, the class GeoHealthCheck.plugins.check.checks.HttpStatusNoError
:
1import sys
2from owslib.etree import etree
3from GeoHealthCheck.util import CONFIG
4from GeoHealthCheck.plugin import Plugin
5from GeoHealthCheck.check import Check
6from html import escape
7
8
9""" Contains basic Check classes for a Probe object."""
10
11
12class HttpStatusNoError(Check):
13 """
14 Checks if HTTP status code is not in the 400- or 500-range.
15 """
16
17 NAME = 'HTTP status should not be errored'
18 DESCRIPTION = 'Response should not contain a HTTP 400 or 500 range Error'
19
20 def __init__(self):
21 Check.__init__(self)
22
23 def perform(self):
24 """Default check: Resource should at least give no error"""
25 status = self.probe.response.status_code
26 overall_status = status // 100
27 if overall_status in [4, 5]:
28 self.set_result(False, 'HTTP Error status=%d' % status)
29
30
31class HttpHasHeaderValue(Check):
32 """
33 Checks if header exists and has given header value.
34 See http://docs.python-requests.org/en/master/user/quickstart
Also this class is quite simple: providing class-attributes NAME, DESCRIPTION and implementing
the base-class method GeoHealthCheck.check.Check.perform()
. Via self.probe a Check always
has a reference to its parent Probe instance and the HTTP Response object via self.probe.response.
The check itself is a test if the HTTP status code is in the 400 or 500-range. The CheckResult
is implicitly created by setting: self.set_result(False, ‘HTTP Error status=%d’ % status) in case
of errors. self.set_result() only needs to be called when a Check fails. By default the Result is
succes (True).
According to this pattern more advanced Probes are implemented for OWS GetCapabilities, the most
basic test for OWS-es like WMS and WFS. Below the implementation
of the class GeoHealthCheck.plugins.probe.owsgetcaps.OwsGetCaps
and its derived classes
for specific OWS-es:
1from GeoHealthCheck.plugin import Plugin
2from GeoHealthCheck.probe import Probe
3
4
5class OwsGetCaps(Probe):
6 """
7 Fetch OWS capabilities doc
8 """
9
10 AUTHOR = 'GHC Team'
11 NAME = 'OWS GetCapabilities'
12 DESCRIPTION = 'Perform GetCapabilities Operation and check validity'
13 # Abstract Base Class for OGC OWS GetCaps Probes
14 # Needs specification in subclasses
15 # RESOURCE_TYPE = 'OGC:ABC'
16
17 REQUEST_METHOD = 'GET'
18 REQUEST_TEMPLATE = \
19 '?SERVICE={service}&VERSION={version}&REQUEST=GetCapabilities'
20
21 PARAM_DEFS = {
22 'service': {
23 'type': 'string',
24 'description': 'The OWS service within resource endpoint',
25 'default': None,
26 'required': True
27 },
28 'version': {
29 'type': 'string',
30 'description': 'The OWS service version within resource endpoint',
31 'default': None,
32 'required': True,
33 'range': None
34 }
35 }
36 """Param defs, to be specified in subclasses"""
37
38 CHECKS_AVAIL = {
39 'GeoHealthCheck.plugins.check.checks.HttpStatusNoError': {
40 'default': True
41 },
42 'GeoHealthCheck.plugins.check.checks.XmlParse': {
43 'default': True
44 },
45 'GeoHealthCheck.plugins.check.checks.NotContainsOwsException': {
46 'default': True
47 },
48 'GeoHealthCheck.plugins.check.checks.ContainsStrings': {
49 'set_params': {
50 'strings': {
51 'name': 'Contains Title Element',
52 'value': ['Title>']
53 }
54 },
55 'default': True
56 },
57 }
58 """
59 Checks avail for all specific Caps checks.
60 Optionally override Check PARAM_DEFS using set_params
61 e.g. with specific `value`.
62 """
63
64
65class WmsGetCaps(OwsGetCaps):
66 """Fetch WMS capabilities doc"""
67
68 NAME = 'WMS GetCapabilities'
69 RESOURCE_TYPE = 'OGC:WMS'
70
71 PARAM_DEFS = Plugin.merge(OwsGetCaps.PARAM_DEFS, {
72
73 'service': {
74 'value': 'WMS'
75 },
76 'version': {
77 'default': '1.3.0',
78 'range': ['1.1.1', '1.3.0']
79 }
80 })
81 """Param defs"""
82
83
84class WfsGetCaps(OwsGetCaps):
85 """WFS GetCapabilities Probe"""
86
87 NAME = 'WFS GetCapabilities'
88 RESOURCE_TYPE = 'OGC:WFS'
89
90 def __init__(self):
91 OwsGetCaps.__init__(self)
92
93 PARAM_DEFS = Plugin.merge(OwsGetCaps.PARAM_DEFS, {
94 'service': {
95 'value': 'WFS'
96 },
97 'version': {
98 'default': '1.1.0',
99 'range': ['1.0.0', '1.1.0', '2.0.2']
100 }
101 })
102 """Param defs"""
103
104
105class WcsGetCaps(OwsGetCaps):
106 """WCS GetCapabilities Probe"""
107
108 NAME = 'WCS GetCapabilities'
More elaborate but still only class-attributes are used! Compared to
GeoHealthCheck.plugins.probe.http.HttpGet
, two additional class-attributes are used
in GeoHealthCheck.plugins.probe.owsgetcaps.OwsGetCaps
:
REQUEST_TEMPLATE =’?SERVICE={service}&VERSION={version}&REQUEST=GetCapabilities’
PARAM_DEFS for the REQUEST_TEMPLATE
GHC will recognize a REQUEST_TEMPLATE (for GET or POST) and use PARAM_DEFS to substitute configured or default values, here defined in subclasses. This string is then appended to the Resource URL.
Three Checks are available, all included by default. Also see the construct:
'GeoHealthCheck.plugins.check.checks.ContainsStrings': {
'set_params': {
'strings': {
'name': 'Contains Title Element',
'value': ['Title>']
}
},
'default': True
},
This not only assigns this Check automatically on creation, but also provides it
with parameters, in this case a Capabilities response document should always
contain a <Title> XML element. The class
GeoHealthCheck.plugins.check.checks.ContainsStrings
checks if a response doc contains
all of a list (array) of configured strings. So the full checklist on the response doc is:
is it XML-parsable:
GeoHealthCheck.plugins.check.checks.XmlParse
does not contain an Exception:
GeoHealthCheck.plugins.check.checks.NotContainsOwsException
does it have a <Title> element:
GeoHealthCheck.plugins.check.checks.ContainsStrings
These Checks are performed in that order. If any fails, the Probe Run is in error.
We can now look at classes derived from GeoHealthCheck.plugins.probe.owsgetcaps.OwsGetCaps
, in particular
GeoHealthCheck.plugins.probe.owsgetcaps.WmsGetCaps
and GeoHealthCheck.plugins.probe.owsgetcaps.WfsGetCaps
.
These only need to set their RESOURCE_TYPE e.g. OGC:WMS and override/merge PARAM_DEFS. For example for WMS:
PARAM_DEFS = Plugin.merge(OwsGetCaps.PARAM_DEFS, {
'service': {
'value': 'WMS'
},
'version': {
'default': '1.1.1',
'range': ['1.1.1', '1.3.0']
}
})
This sets a fixed value for service, later becoming service=WMS in the URL request string. For version it sets both a range of values a user can choose from, plus a default value 1.1.1. Plugin.merge needs to be used to merge-in new values. Alternatively PARAM_DEFS can be completely redefined, but in this case we only need to make per-OWS specific settings.
Also new in this example is parameterization of Checks for the class
GeoHealthCheck.plugins.check.checks.ContainsStrings
. This is a generic
HTTP response checker for a list of strings that each need to be present in the
response. Alternatively GeoHealthCheck.plugins.check.checks.NotContainsStrings
has
the reverse test. Both are extremely useful and for example available to our
first example GeoHealthCheck.plugins.probe.http.HttpGet
.
The concept of PARAM_DEFS is the same for Probes and Checks.
In fact a Probe for any REST API could be defined in the above matter. For example, later in the project a Probe was added for the SensorThings API (STA), a recent OGC-standard for managing Sensor data via a JSON REST API. See the listing below:
1from GeoHealthCheck.probe import Probe
2
3
4class StaCaps(Probe):
5 """Probe for SensorThings API main endpoint url"""
6
7 NAME = 'STA Capabilities'
8 DESCRIPTION = 'Perform STA Capabilities Operation and check validity'
9 RESOURCE_TYPE = 'OGC:STA'
10
11 REQUEST_METHOD = 'GET'
12
13 def __init__(self):
14 Probe.__init__(self)
15
16 CHECKS_AVAIL = {
17 'GeoHealthCheck.plugins.check.checks.HttpStatusNoError': {
18 'default': True
19 },
20 'GeoHealthCheck.plugins.check.checks.JsonParse': {
21 'default': True
22 },
23 'GeoHealthCheck.plugins.check.checks.ContainsStrings': {
24 'default': True,
25 'set_params': {
26 'strings': {
27 'name': 'Must contain STA Entity names',
28 'value': ['Things', 'Datastreams', 'Observations',
29 'FeaturesOfInterest', 'Locations']
30 }
31 }
32 },
33 }
34 """
35 Checks avail for all specific Caps checks.
36 Optionally override Check.PARAM_DEFS using set_params
37 e.g. with specific `value` or even `name`.
38 """
39
40
41class StaGetEntities(Probe):
42 """Fetch STA entities of type and check result"""
43
44 NAME = 'STA GetEntities'
45 DESCRIPTION = 'Fetch all STA Entities of given type'
46 RESOURCE_TYPE = 'OGC:STA'
47
48 REQUEST_METHOD = 'GET'
49
50 # e.g. http://52.26.56.239:8080/OGCSensorThings/v1.0/Things
51 REQUEST_TEMPLATE = '/{entities}'
52
53 def __init__(self):
54 Probe.__init__(self)
55
56 PARAM_DEFS = {
57 'entities': {
58 'type': 'string',
59 'description': 'The STA Entity collection type',
60 'default': 'Things',
61 'required': True,
62 'range': ['Things', 'DataStreams', 'Observations',
63 'Locations', 'Sensors', 'FeaturesOfInterest',
64 'ObservedProperties', 'HistoricalLocations']
65 }
66 }
67 """Param defs"""
68
69 CHECKS_AVAIL = {
70 'GeoHealthCheck.plugins.check.checks.HttpStatusNoError': {
71 'default': True
72 },
73 'GeoHealthCheck.plugins.check.checks.JsonParse': {
74 'default': True
75 }
76 }
77 """Check for STA Get entity Collection"""
Up to now all Probes were defined using and overriding class-attributes. Next is
a more elaborate example where the Probe overrides the Probe baseclass method
GeoHealthCheck.probe.Probe.perform_request()
. The example is
more of a showcase: GeoHealthCheck.plugins.probe.wmsdrilldown.WmsDrilldown
literally drills-down through WMS-entities: starting with the
GetCapabilities doc it fetches the list of Layers and does
a GetMap on random layers etc. It uses OWSLib.WebMapService.
We show the first 70 lines here.
1import random
2
3from GeoHealthCheck.probe import Probe
4from GeoHealthCheck.result import Result
5from owslib.wms import WebMapService
6
7
8class WmsDrilldown(Probe):
9 """
10 Probe for WMS endpoint "drilldown": starting
11 with GetCapabilities doc: get Layers and do
12 GetMap on them etc. Using OWSLib.WebMapService.
13
14 TODO: needs finalization.
15 """
16
17 NAME = 'WMS Drilldown'
18 DESCRIPTION = 'Traverses a WMS endpoint by drilling down from Capabilities'
19 RESOURCE_TYPE = 'OGC:WMS'
20
21 REQUEST_METHOD = 'GET'
22
23 PARAM_DEFS = {
24 'drilldown_level': {
25 'type': 'string',
26 'description': 'How heavy the drilldown should be.',
27 'default': 'minor',
28 'required': True,
29 'range': ['minor', 'moderate', 'full']
30 }
31 }
32 """Param defs"""
33
34 def __init__(self):
35 Probe.__init__(self)
36
37 def perform_request(self):
38 """
39 Perform the drilldown.
40 See https://github.com/geopython/OWSLib/blob/
41 master/tests/doctests/wms_GeoServerCapabilities.txt
42 """
43 wms = None
44
45 # 1. Test capabilities doc, parses
46 result = Result(True, 'Test Capabilities')
47 result.start()
48 try:
49 wms = WebMapService(self._resource.url,
50 headers=self.get_request_headers())
51 title = wms.identification.title
52 self.log('response: title=%s' % title)
53 except Exception as err:
54 result.set(False, str(err))
55
56 result.stop()
57 self.result.add_result(result)
58
59 # 2. Test layers
60 # TODO: use parameters to work on less/more drilling
61 # "full" could be all layers.
62 result = Result(True, 'Test Layers')
63 result.start()
64 try:
65 # Pick a random layer
66 layer_name = random.sample(wms.contents.keys(), 1)[0]
67 layer = wms[layer_name]
68
69 # TODO Only use EPSG:4326, later random CRS
70 if 'EPSG:4326' in layer.crsOptions \
This shows that any kind of simple or elaborate healthchecks can be implemented using
single or multiple HTTP requests. As long as Result objects are set via
self.result.add_result(result). It is optional to also define Checks in this case.
In the example GeoHealthCheck.plugins.probe.wmsdrilldown.WmsDrilldown
example no
Checks are used.
One can imagine custom Probes for many use-cases:
drill-downs for OWS-es
checking both the service and its metadata (CSW links in Capabilities doc e.g.)
gaps in timeseries data (SOS, STA)
even checking resources like a remote GHC itself!
Writing custom Probes is only limited by your imagination!
6.4. Configuration
Plugins available to a GHC installation are configured via config_main.py and overridden in config_site.py. By default all built-in Plugins are available.
GHC_PLUGINS: list of built-in/core Plugin classes and/or modules available on installation
GHC_PROBE_DEFAULTS: Default Probe class to assign on “add” per Resource-type
GHC_USER_PLUGINS: list of your Plugin classes and/or modules available on installation
To add your Plugins, you need to configure GHC_USER_PLUGINS. In most cases you don’t need to bother with GHC_PLUGINS and GHC_PROBE_DEFAULTS.
See an example for both below from config_main.py for GHC_PLUGINS and GHC_PROBE_DEFAULTS:
GHC_PLUGINS = [
# Probes
'GeoHealthCheck.plugins.probe.owsgetcaps',
'GeoHealthCheck.plugins.probe.wms',
'GeoHealthCheck.plugins.probe.wfs.WfsGetFeatureBbox',
'GeoHealthCheck.plugins.probe.tms',
'GeoHealthCheck.plugins.probe.http',
'GeoHealthCheck.plugins.probe.sta',
'GeoHealthCheck.plugins.probe.wmsdrilldown',
'GeoHealthCheck.plugins.probe.ogcfeat',
# Checks
'GeoHealthCheck.plugins.check.checks',
]
# Default Probe to assign on "add" per Resource-type
GHC_PROBE_DEFAULTS = {
'OGC:WMS': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.WmsGetCaps'
},
'OGC:WMTS': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.WmtsGetCaps'
},
'OSGeo:TMS': {
'probe_class': 'GeoHealthCheck.plugins.probe.tms.TmsCaps'
},
'OGC:WFS': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.WfsGetCaps'
},
'OGC:WCS': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.WcsGetCaps'
},
'OGC:WPS': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.WpsGetCaps'
},
'OGC:CSW': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.CswGetCaps'
},
'OGC:SOS': {
'probe_class': 'GeoHealthCheck.plugins.probe.owsgetcaps.SosGetCaps'
},
'OGC:STA': {
'probe_class': 'GeoHealthCheck.plugins.probe.sta.StaCaps'
},
'OGCFeat': {
'probe_class': 'GeoHealthCheck.plugins.probe.ogcfeat.OGCFeatDrilldown'
},
'ESRI:FS': {
'probe_class': 'GeoHealthCheck.plugins.probe.esrifs.ESRIFSDrilldown'
},
'urn:geoss:waf': {
'probe_class': 'GeoHealthCheck.plugins.probe.http.HttpGet'
},
'WWW:LINK': {
'probe_class': 'GeoHealthCheck.plugins.probe.http.HttpGet'
},
'FTP': {
'probe_class': None
}
}
To add your User Plugins these steps are needed:
place your Plugin in any directory
specify your Plugin in config_site.py in GHC_USER_PLUGINS var
your Plugin module needs to be available in the PYTHONPATH of the GHC app
Let’s say your Plugin is in file /plugins/ext/myplugin.py. Example config_site.py
GHC_USER_PLUGINS='ext.myplugin'
Then you need to add the path /plugins to the PYTHONPATH such that your Plugin is found.
6.5. User Plugins via Docker
The easiest way to add your Plugins (and running GHC in general!) is by using GHC Docker. See more info in the GHC Docker Plugins README.
6.6. Plugin API Docs
For GHC extension via Plugins the following classes apply.
Most Plugins have PARAM_DEFS parameter definitions. These are variables that should be filled in by the user in the GUI unless a fixed value applies.
6.6.1. Plugins - Base Classes
These are the base classes for GHC Plugins. Developers will mainly extend Probe and Check.
Results are helper-classes whose intances are generated by both Probe and Check classes. They form the ultimate outcome when running a Probe. A ResourceResult contains ProbeResults, the latter contains CheckResults.
6.6.2. Plugins - Probes
Probes apply to a single Resource instance. They are responsible for running requests against the Resource URL endpoint. Most Probes are implemented mainly via configuring class variables in particular PARAM_DEFS and CHECKS_AVAIL, but one is free to override any of the Probe baseclass methods.
6.6.3. Plugins - Checks
Checks apply to a single Probe instance. They are responsible for checking request results from their Probe.
6.6.4. Plugins - Resource Auth
ResourceAuth apply to optional authentication for a Resource instance. They are responsible for handling any (UI) configuration, encoding and execution of specific HTTP authentication methods for the Resource endpoint.
6.6.5. Plugins - Geocoder
Geocoder apply to geocoder services. They are responsible for geolocating a server on a map.