anchor.diff:  |DatabaseCleanupTask
   |-
   
  -|genie.tasks.databaseCleanup.duration.timer
  -|Time taken to cleanup database records for jobs that executed over a given amount of time in the past
  -|nanoseconds
  -|DatabaseCleanupTask
  -|status, exceptionClass
  -
   |genie.tasks.diskCleanup.numberDeletedJobDirs.gauge
   |Number of job folders deleted during the last cleanup pass
   |amount
  
positive.code: |JobStateServiceImpl
  |-
  
  |genie.jobs.unableToCancel.rate
  |Count number of times a job asynchronous task cancelling was requested and failed (failure to cancel may be due to the task no longer being running)
  |count
  |JobStateServiceImpl
  |-
  
  |genie.jobs.notifications.final-state.counter
  |Count the number of completed job notifications
  |count
  |JobNotificationMetricPublisher
  |jobFinalState
  
  |genie.jobs.notifications.state-transition.counter
  |Count the number of job transitions notifications
  |count
  |JobNotificationMetricPublisher
  |fromState, toState
  
  |genie.jobs.submit.localRunner.overall.timer
  |Time takend to submit a new job (create workspace and scripts, register in database and kick off)
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.localRunner.createJobDir.timer
  |Time taken to create a job working directory (includes failures to create)
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.localRunner.createRunScript.timer
  |Time taken to create the job run script
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.localRunner.executeJob.timer
  |Time taken to execute the job workflow tasks
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.localRunner.saveJobExecution.timer
  |Time taken to persist information about job execution
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.localRunner.publishJobStartedEvent.timer
  |Time taken to publish the event that announces a job has started
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.localRunner.createInitFailureDetailsFile.timer
  |Time taken to write a file with details about failure to launch a job
  |nanoseconds
  |LocalJobRunner
  |-
  
  |genie.jobs.submit.rejected.jobs-limit.counter
  |Count of jobs rejected by the server because the user is exceeding the maximum number of running jobs
  |count
  |JobCoordinatorServiceImpl
  |user, jobsUserLimit
  
  |genie.jobs.agentDisconnected.gauge
  |Current number of agent jobs whose agent is not connected to any node.
  |count
  |AgentJobCleanupTask
  |-
  
  |genie.jobs.agentDisconnected.terminated.counter
  |Counter of jobs terminated because the agent disappeared for too long
  |count
  |AgentJobCleanupTask
  |status, exceptionClass
  
  |genie.files.s3.download.timer
  |Time taken to download a file from S3
  |nanoseconds
  |S3FileTransferImpl
  |status, exceptionClass
  
  |genie.files.s3.upload.timer
  |Time taken to upload a local file to S3
  |nanoseconds
  |S3FileTransferImpl
  |status, exceptionClass
  
  |genie.files.s3.getObjectMetadata.timer
  |Time taken to obtain S3 file metadata (modification time)
  |nanoseconds
  |S3FileTransferImpl
  |status, exceptionClass
  
  |genie.files.s3.failStrictValidation.counter
  |Count the number of times a S3 URL fails strict validation, but is allowed through anyway
  |count
  |S3FileTransferImpl
  |-
  
  |genie.web.controllers.exception
  |Counts exceptions returned to the user
  |count
  |GenieExceptionMapper
  |exceptionClass (*)
  
  |genie.api.v3.jobs.submitJobWithoutAttachments.rate
  |Counts the number of jobs submitted without an attachment
  |count
  |JobRestController
  |-
  
  |genie.api.v3.jobs.submitJobWithAttachments.rate
  |Counts the number of jobs submitted with one or more attachments
  |count
  |JobRestController
  |-
  
  |genie.security.oauth2.pingFederate.authentication.timer
  |Time taken to process JWT token and obtain OAuth2 authentication
  
negative.code: |SAMLUserDetailsServiceImpl
  |-
  
  |genie.services.agentJob.handshake.counter
  |Counter for calls to the 'handshake' protocol of the Genie Agent Job Service
  |count
  |AgentJobServiceImpl
  |status, exceptionClass, agentVersion, agentHost, handshakeDecision
  
  |genie.services.jobResolver.clusterCommandQuery.timer
  |Time taken to query the database and find clusters and commands matching the supplied criteria.
  |nanoseconds
  |JobResolverServiceImpl
  |status, exceptionClass
  
  |genie.services.jobResolver.loadBalancer.counter
  |Counter for cluster load balancer algorithms invocations
  |count
  |JobResolverServiceImpl
  |class, status, clusterName, clusterId, loadBalancerClass
  
  |genie.services.jobResolver.resolve.timer
  |Time taken to completely resolve the job
  |nanoseconds
  |JobResolverServiceImpl
  |status, exceptionClass, saved
  
  |genie.services.jobResolver.selectApplications.timer
  |Time taken to retrieve applications information for this task
  |nanoseconds
  |JobResolverServiceImpl
  |status, exceptionClass
  
  |genie.services.jobResolver.selectCluster.noneFound.counter
  |Number of times the criteria for cluster selection does not match any cluster
  |count
  |JobResolverServiceImpl
  |-
  
  |genie.services.jobResolver.selectCluster.noneSelected.counter
  |Number of times the cluster load balancing terminated without selecting a cluster
  |count
  |JobResolverServiceImpl
  |-
  
  |genie.services.jobResolver.selectCluster.timer
  |Time taken to select a cluster using the load balancing strategy
  |nanoseconds
  |JobResolverServiceImpl
  |status, exceptionClass
  
  |genie.services.jobResolver.selectCommand.timer
  |Time taken to resolve a command based on criteria and cluster
  |nanoseconds
  |JobResolverServiceImpl
  |status, exceptionClass
  
  |genie.tasks.clusterChecker.failedHealthCheck.counter
  |Counts the number of time the leader retrieved health status of a remote node and one of the (non-ignored) indicators
  had a status different than UP
  |count
  |ClusterCheckerTask
  |host, healthIndicator, healthStatus
  
  |genie.tasks.clusterChecker.invalidResponse.counter
  |Counts the number of time the leader retrieved health status of a remote node and failed to parse the response
  |count
  |ClusterCheckerTask
  |host
  
  |genie.tasks.clusterChecker.jobsMarkedFailed.counter
  |Number of jobs marked as "lost" due to a consistent failure to contact the Genie node hosting them
  |count
  |ClusterCheckerTask
  |status, host, exceptionClass
  
  |genie.tasks.clusterChecker.unhealthyHosts.gauge
  |Number of Genie nodes that the leader has currently marked unhealthy
  |Current amount
  |ClusterCheckerTask
  