I agree, I would definitely not force implementors to provide the method HealthCheck.getMetadata() - I believe it's rarely a good idea to provide meta data programmatically (if we really wanted to have a unique ID, we could add it as service properties like the name or the tags).

Additionally, forcing an implementor to define an id for a health check would feel awkward to 99% of the people, as they only provide them but never use it because the hypothetical signature HealthCheckExecutor.execute(hcId) would normally only be used by JMX.

-Georg

Am 24.12.2013 12:11, schrieb Carsten Ziegeler:
It's not just about the metadata - it's about uniquely identifying a HC within the executor - the service object is not a good key, especially as we have no way to discard it from the cache. The service reference or the
service id contained within the reference is a good key. And uniquely
identifying (for long running hcs) and caching the hc result is for me the
number one reason for the executor service.

We should not change the HC interface as this is an incompatible change and
would break all existing implementations - as we've discussed during
defining the first version of the API, there is no real need to have the
name, tags etc. in the HC interface. Services executing an HC get the
service anyway from the service registry together with these registration
properties and it makes the implementation unnecessarily complicated.

So we need something to uniquely identify a health check and as all
metadata is optional we don't have anything to be used. Now, as I wrote in the issue, I'm fine with having an execute(String name) method which tries to execute a HC with the given name. This would require that a HC which can
be executed by this service either has a tag or a name.
On the other hand, if we go with ServiceReference we can execute all HCs through this service. And as Georg has pointed out, there are not many clients of this service anyway: its the jmx implementation and the web
console.


Carsten


2013/12/24 Bertrand Delacretaz <bdelacre...@apache.org>

Hi,

About SLING-3278 - IMO execute(ServiceReference) at [1] is an
unnecessary leak of implementation details, it makes no sense at the
API level. It's HealthChecks that we are executing, not service
references.

IIUC the root cause is that the HealthCheck API doesn't provide
metadata that it should: tags, name, optional JMX MBean name, unique
ID maybe, all these things clearly belong to a HealthCheck, so the API
should provide access to them, even if they are defined by service
properties.

I suggest adding a HealthCheckMetadata interface to provide those
things (tags, name, optional things in a Map maybe), and add a
HealthCheck.getMetadata() method that returns this. That'll break
existing HealthCheck implementations, which we indicate by bumping up the package version number, as this quite a new API it's better to fix
it now than later.

-Bertrand

[1]

https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/healthcheck/core/src/main/java/org/apache/sling/hc/api/HealthCheckExecutor.java


Reply via email to