diff --git a/_data/versions.yaml b/_data/versions.yaml index ad3289c3..25568d23 100644 --- a/_data/versions.yaml +++ b/_data/versions.yaml @@ -1,23 +1,24 @@ cryostat: - version: '4.1.0' - release-branch: 'cryostat-v4.1' + version: '4.2.0' + release-branch: 'cryostat-v4.2' agent: - version: '0.6.0' + version: '0.7.0' openshift: - version: '4.16' + version: '4.19' kubernetes: - version: '1.29' + version: '1.32' operator-sdk: - version: '1.31.0' + version: '1.42.0' operator-lifecycle-manager: version: '0.25.0' cert-manager: - version: '1.13.6' + version: '1.18.6' maven-plugins: dependency: version: '3.9.0' documentation: - 'latest' + - 4.1.0 - 4.0.0 - 3.0.0 - 2.4.0 diff --git a/docs/_subsections/configure-agent-harvester.md b/docs/_subsections/configure-agent-harvester.md index 6d23ded2..f0bb5b0b 100644 --- a/docs/_subsections/configure-agent-harvester.md +++ b/docs/_subsections/configure-agent-harvester.md @@ -12,6 +12,7 @@ The **Harvester** supports a number of configuration options that can be used to - `cryostat.agent.harvester.exit.max-size-b` [`long`]: the JFR `maxsize` setting, specified in bytes, to apply to exit uploads as described above. - `cryostat.agent.harvester.max-age-ms` [`long`]: the JFR `maxage` setting, specified in milliseconds, to apply to periodic uploads during the application lifecycle. Defaults to `0`, which is interpreted as 1.5x the harvester period (`cryostat.agent.harvester.period-ms`). - `cryostat.agent.harvester.max-size-b` [`long`]: the JFR `maxsize` setting, specified in bytes, to apply to periodic uploads during the application lifecycle. Defaults to `0`, which means `unlimited`. +- `cryostat.agent.harvester.autoanalyze` [`boolean`]: whether the pushed recordings should be marked for automatic analysis by the Cryostat server. Defaults to true. Note that the **Harvester Period** and **Template** options must be set for the **Harvester** to regularly push **JFR** data. If only the **Template** is set the **Harvester** will only attempt to push on shutdown. If neither are set the **Harvester** will not do anything unless configured alongside **Smart Triggers** as described below. @@ -30,6 +31,9 @@ or by setting them as environment variables, for example: - name: CRYOSTAT_AGENT_HARVESTER_TEMPLATE value: Profiling ``` + +The **Cryostat Operator** supports several labels for configuring the **Harvester** through **Agent Autoconfiguration**. For more information, see [Agent Autoconfiguration](/docs/#agent-autoconfiguration) + #### [MBean Trigger Integration](#mbean-trigger-integration) When the **Cryostat Agent** is configured to start dynamic recordings based on custom MBean triggers, you can also integrate them with the **Harvester** to automatically push the collected **JFR** data to the **Cryostat Server**. diff --git a/docs/_subsections/configuring-the-helm-chart.md b/docs/_subsections/configuring-the-helm-chart.md new file mode 100644 index 00000000..e26c3f73 --- /dev/null +++ b/docs/_subsections/configuring-the-helm-chart.md @@ -0,0 +1,273 @@ +## [Configure the Cryostat Helm Chart](#configure-the-helm-chart) + +The **Cryostat Helm Chart** supports a large number of configuration options to allow the user to tailor the **Cryostat** deployment to their particular setups and applications. The following guide will detail the available configuration options when deploying the helm chart. + +If there are further customizations required to suit your deployment environment, choose the settings values that get you closest to what you need, then manually edit the resulting Kubernetes objects to suit your requirements. You may also consider using helm install --dry-run to render the Kubernetes YAML manifests without installing them, so that you can apply your own customization patches as needed. + +### Configuring TLS + +When installed on OpenShift with authentication.openshift.enabled=true, the cluster's "service serving certificates" feature is used to enable managed **TLS** configuration on the exposed HTTP(S) ports. + +When installed with authentication.openshift.enabled=false but oauth2Proxy.tls.selfSigned.enabled=true then a self-signed **TLS** certificate will be generated at installation time to serve similar purposes. These **TLS** certificates are not managed, will not automatically rotate, and will expire after 365 days. You will need to manually rotate the certificates, or reinstall the chart, or else apply your own customizations to the **Kubernetes** manifests to automate **TLS** certificate issuance and rotation. + +## Configuration Options + +### Cryostat Container + +| Name | Description | Value | +| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | +| `core` | Configuration for the core Cryostat application | | +| `core.image.repository` | Repository for the main Cryostat container image | `quay.io/cryostat/cryostat` | +| `core.image.pullPolicy` | Image pull policy for the main Cryostat container image | `Always` | +| `core.image.tag` | Tag for the main Cryostat container image | `4.1.0-snapshot` | +| `core.podAnnotations` | Annotations to be applied to the Cryostat Pods | `{}` | +| `core.service.type` | Type of Service to create for the Cryostat application | `ClusterIP` | +| `core.service.httpPort` | Port number to expose on the Service for Cryostat's HTTP server | `8181` | +| `core.service.annotations` | Annotations to be applied to the Service for Cryostat's HTTP server | `{}` | +| `core.debug.log.level` | Log level for troubleshooting and debugging | `INFO` | +| `core.sslProxied` | Enables SSL Proxied Environment Variables, useful when you are offloading SSL/TLS at External Loadbalancer instead of Ingress | `false` | +| `core.ingress.enabled` | Whether to create an Ingress object for the Cryostat service | `false` | +| `core.ingress.className` | Ingress class name for the Cryostat application Ingress | `""` | +| `core.ingress.annotations` | Annotations to apply to the Cryostat application Ingress | `{}` | +| `core.ingress.hosts` | Hosts to create rules for in the Cryostat application Ingress. See: [IngressSpec](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-v1/#IngressSpec) | `[]` | +| `core.ingress.tls` | TLS configuration for the Cryostat application Ingress. See: [IngressSpec](https://kubernetes.io/docs/reference/kubernetes-api/service-resources/ingress-v1/#IngressSpec) | `[]` | +| `core.route.enabled` | Whether to create a Route object for the Cryostat service. Available only on OpenShift | `false` | +| `core.route.tls.enabled` | Whether to secure the Cryostat application Route with TLS. See: [TLSConfig](https://docs.openshift.com/container-platform/4.10/rest_api/network_apis/route-route-openshift-io-v1.html#spec-tls) | `true` | +| `core.route.tls.termination` | Type of TLS termination to use for the Cryostat application Route. One of: `edge`, `passthrough`, `reencrypt` | `edge` | +| `core.route.tls.insecureEdgeTerminationPolicy` | Specify how to handle insecure traffic for the Cryostat application Route. One of: `Allow`, `Disable`, `Redirect` | `Redirect` | +| `core.route.tls.key` | Custom private key to use when securing the Cryostat application Route | `""` | +| `core.route.tls.certificate` | Custom certificate to use when securing the Cryostat application Route | `""` | +| `core.route.tls.caCertificate` | Custom CA certificate to use, if needed to complete the certificate chain, when securing the Cryostat application Route | `""` | +| `core.route.tls.destinationCACertificate` | Provides the contents of the CA certificate of the final destination when using reencrypt termination for the Cryostat application Route | `""` | +| `core.resources.requests.cpu` | CPU resource request for the Cryostat container. See: [ResourceRequirements](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#resources) | `500m` | +| `core.resources.requests.memory` | Memory resource request for the Cryostat container | `384Mi` | +| `core.securityContext` | Security Context for the Cryostat container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `core.databaseSecretName` | Name of the secret containing database keys. This secret must contain a USERNAME secret which is the database connection username, a CONNECTION_KEY secret which is the database connection password, and an ENCRYPTION_KEY secret which is the key used to encrypt sensitive data stored within the database, such as the target credentials keyring. It must not be updated across chart upgrades. It is recommended that the secret should be marked as immutable to avoid accidental changes to secret's data. More details: https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable | `""` | +| `core.discovery` | Configuration options to the Cryostat application's target discovery mechanisms | | +| `core.discovery.kubernetes.enabled` | Enables Kubernetes API discovery mechanism | `true` | +| `core.discovery.kubernetes.installNamespaceDisabled` | When false and `namespaces` is empty, the Cryostat application will default to discovery targets in the install namespace (i.e. `{{ .Release.Namespace }}`) | `false` | +| `core.discovery.kubernetes.allowAllNamespaces` | When true, this overrides the `core.discovery.kubernetes.namespaces` list and configures the Cryostat application to monitor all namespaces in the cluster. This requires elevated permissions to create a ClusterRole and ClusterRoleBinding, which will be done automatically if the `rbac.create` value is `true`. WARNING: This allows Cryostat to discover, and potentially connect to and collect data from, applications in *any* Namespace in the cluster. ALL users with access to this Cryostat instance will be able to read data from potentially any application in the cluster. For data security and isolation concerns it is recommended to leave this setting disabled, and instead install multiple Cryostat instances with lists of target namespaces, and apply sensible access controls for users to each instance as needed | `false` | +| `core.discovery.kubernetes.namespaces` | List of namespaces whose workloads the Cryostat application should be permitted to access and profile | `[]` | +| `core.discovery.kubernetes.builtInPortNamesDisabled` | When false and `portNames` is empty, the Cryostat application will use the default port name `jfr-jmx` to look for JMX connectable targets | `false` | +| `core.discovery.kubernetes.portNames` | List of port names that the Cryostat application should look for in order to consider a target as JMX connectable | `[]` | +| `core.discovery.kubernetes.builtInPortNumbersDisabled` | When false and `portNumbers` is empty, the Cryostat application will use the default port number `9091` to look for JMX connectable targets | `false` | +| `core.discovery.kubernetes.portNumbers` | List of port numbers that the Cryostat application should look for in order to consider a target as JMX connectable | `[]` | +| `core.config.declarative.fsMode` | default filesystem mode (permissions) for declarative configuration volumes | `440` | +| `core.config.credentials.secretNames` | List of Secret names. Each Secret is expected to contain one or more files, which are json Stored Credentials, to be mounted to the Cryostat container | `[]` | +| `core.config.rules.configMapNames` | List of ConfigMap names. Each ConfigMap is expected to contain one or more files, which are automated rule definitions, to be mounted to the Cryostat container | `[]` | +| `core.config.probeTemplates.configMapNames` | List of ConfigMap names. Each ConfigMap is expected to contain one or more files, which are XML JMC Agent Probe Templates, to be mounted to the Cryostat container | `[]` | +| `core.config.eventTemplates.configMapNames` | List of ConfigMap names. Each ConfigMap is expected to contain one or more files, which are .jfc (XML) JFR Event Templates, to be mounted to the Cryostat container | `[]` | +| `core.config.tlsTruststore.secretNames` | List of Secret names. Each Secret is expected to contain one or more files, which are TLS certificates which target applications may use for their JMX servers, to be mounted to the Cryostat container for its TLS truststore | `[]` | +| `core.config.extra` | Extra configurations for the main Cryostat container | | +| `core.config.extra.envVars` | Extra environment variables for main Cryostat container container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `core.config.extra.envSources` | Sources for extra variables for main Cryostat container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `core.nodeSelector` | Node Selector for the Cryostat Pod. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `core.tolerations` | Tolerations for the Cryostat Pod. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | +| `core.affinity` | Affinity for the Cryostat Pod. See: [Affinity](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | + +### Report Generator Deployment + +| Name | Description | Value | +| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | +| `reports` | Configuration for the Reports Generator deployment | | +| `reports.image.repository` | Repository for the Report Generator container image | `quay.io/cryostat/cryostat-reports` | +| `reports.image.pullPolicy` | Image pull policy for the Report Generator container image | `Always` | +| `reports.image.tag` | Tag for the Report Generator image | `4.1.0-snapshot` | +| `reports.podAnnotations` | Annotations to be applied to the Report Generator Pods | `{}` | +| `reports.service.type` | Type of Service to create for the Report Generator Deployment | `ClusterIP` | +| `reports.service.httpPort` | Port number to expose on the Service for the Report Generator Deployment | `10001` | +| `reports.service.annotations` | Annotations to be applied to the Service for the Report Generator Deployment | `{}` | +| `reports.reportsSecretName` | Name of the secret containing the report generator access keys. This secret must contain a REPORTS_PASS secret which is the secret credential for the report generators. It must not be updated across chart upgrades, or else the connection between Cryostat and report generators will not be able to initialize. It is recommended that the secret should be marked as immutable to avoid accidental changes to secret's data. More details: https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable | `""` | +| `reports.debug.log.level` | Log level for troubleshooting and debugging | `INFO` | +| `reports.replicas` | Number of Report Generator replicas to deploy. If zero, the Deployment and Service will not be created and the main Cryostat container will handle all report generations on its own | `0` | +| `reports.resources.requests.cpu` | CPU resource request for each Pod in the Report Generator Deployment | `500m` | +| `reports.resources.requests.memory` | Memory resource request for each Pod in the Report Generator Deployment | `512Mi` | +| `reports.securityContext` | Security Context for the Report Generator containers. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `reports.config.extra` | Extra configurations for the Report Generator container | | +| `reports.config.extra.envVars` | Extra environment variables for the Report Generator container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `reports.config.extra.envSources` | Sources for extra variables for the Report Generator container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `reports.nodeSelector` | Node Selector for the Report Generator Pods. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `reports.tolerations` | Tolerations for the Report Generator Pods. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | +| `reports.affinity` | Affinity for the Report Generator Pods. See: [Affinity](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | + +### Database Container + +| Name | Description | Value | +| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | +| `db` | Configuration for Cryostat's database | | +| `db.image.repository` | Repository for the database container image | `quay.io/cryostat/cryostat-db` | +| `db.image.pullPolicy` | Image pull policy for the database container image | `Always` | +| `db.image.tag` | Tag for the database container image | `latest` | +| `db.provider.url` | URL to the database instance. This can be an in-cluster self-hosted instance with a hostname like db.myapp.local, or it can be an external commercial service. This should be a complete JDBC URL with scheme, host, and port. User authentication information should be provided using a *Secret* and *core.databaseSecretName*. If this URL is not specified then a managed [cryostat-db](https://github.com/cryostatio/cryostat-db) instance will be automatically deployed and configured. If an unmanaged database instance is specified here then other database configuration settings (Pod annotations, Service configurations) do not apply. The database must be a Postgres instance with the pgcrypto extension enabled. | `""` | +| `db.podAnnotations` | Annotations to be applied to the Database Pods | `{}` | +| `db.service.type` | Type of Service to create for the database | `ClusterIP` | +| `db.service.port` | Port number to expose on the Service | `5432` | +| `db.service.annotations` | Annotations to be applied to the Service for the database | `{}` | +| `db.resources.requests.cpu` | CPU resource request for the database container. See: [ResourceRequirements](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#resources) | `25m` | +| `db.resources.requests.memory` | Memory resource request for the database container | `64Mi` | +| `db.pvc.enabled` | Specify whether to use persistentVolumeClaim (true) or EmptyDir storage (false). This is recommended to be enabled, but the storage size and selector should be chosen carefully first | `false` | +| `db.pvc.annotations` | Annotations to add to the persistentVolumeClaim | `{}` | +| `db.pvc.storage` | Storage size to request for the persistentVolumeClaim | `500Mi` | +| `db.pvc.accessModes` | Access mode for the persistentVolumeClaim. See: [Access Modes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) | `["ReadWriteOnce"]` | +| `db.pvc.selector` | Selector for the persistentVolumeClaim. See: [Selector](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) | `{}` | +| `db.pvc.storageClassName` | The name of the StorageClass for the persistentVolumeClaim. See: [Class](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) | `undefined` | +| `db.securityContext` | Security Context for the database container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `db.config.extra` | Extra configurations for the database container | | +| `db.config.extra.envVars` | Extra environment variables for the database container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `db.config.extra.envSources` | Sources for extra variables for the database container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `db.nodeSelector` | Node Selector for the Database Pod. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `db.tolerations` | Tolerations for the Database Pod. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | +| `db.affinity` | Affinity for the Database Pod. See: [Affinity](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | + +### Storage Container + +| Name | Description | Value | +| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------- | +| `storage` | Configuration for Cryostat's object storage provider | | +| `storage.image.repository` | Repository for the storage container image | `quay.io/cryostat/cryostat-storage` | +| `storage.image.pullPolicy` | Image pull policy for the storage container image | `Always` | +| `storage.image.tag` | Tag for the storage container image | `latest` | +| `storage.storageSecretName` | Name of the secret containing the object storage secret access key. This secret must contain a STORAGE_ACCESS_KEY secret which is the object storage secret access key. It must not be updated across chart upgrades, or else the connection between Cryostat components and object storage will not be able to initialize. If using an external S3 provider requiring authentication then this **must** be provided. It is recommended that the secret should be marked as immutable to avoid accidental changes to secret's data. More details: [Kubernetes Secrets](https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable) | `""` | +| `storage.provider.url` | URL to the S3 object storage provider instance. This can be an in-cluster self-hosted instance with a hostname like s3.storage.local, or it can be an external commercial service. This should include scheme, host, and port. User authenication information should be provided using a *Secret* and *storage.storageSecretName*. If this is not specified then a managed [cryostat-storage](https://github.com/cryostatio/cryostat-storage) instance will be automatically deployed and configured. If an unmanaged S3 instance is specified here then other storage configuration settings (such as at-rest encryption, Pod annotations, Service configurations) do not apply. Production installations of Cryostat should not rely on `cryostat-storage` | `""` | +| `storage.provider.usePathStyleAccess` | whether path-style accesses are used for ex. object buckets. If path style access is not used then DNS subdomain resolution will be used. This is *true* by default for broader compatibility for low-footprint storage container installations, but subdomain resolution generally offers better performance if it is available and may be required for use with commercial storage providers. | `true` | +| `storage.provider.usePresignedRecordingTransfers` | whether object storage presigned GET URLs should be used for transferring files between Cryostat components (ex. for automated analysis report generation). If this is disabled then Cryostat will act as a "network pipe" between other components and handle streaming file contents. This is *true* by default to reduce network utilization and request latency | `true` | +| `storage.provider.usePresignedDownloads` | whether object storage presigned GET URLs should be used for downloading files via the user's browser. If this is disabled then Cryostat will act as a "network pipe" between storage and the user's browser and handle streaming file contents. If the object storage URLs are not accessible from the user's network location then this must be disabled, otherwise enabling it will reduce network utilization and request latency. This is *false* by default | `false` | +| `storage.provider.region` | S3 object storage provider region. This may be used by the storage provider to geolocate the physical storage in a particular region for regulatory, performance, or cost reasons | `""` | +| `storage.provider.authentication.credentialsType` | configuration for how the S3 client will locate credentials for the S3 service. See: [Quarkus S3 client](https://docs.quarkiverse.io/quarkus-amazon-services/dev/amazon-s3.html#) | `default` | +| `storage.provider.tls.trustAll` | enable this to disable TLS certificate verification on the S3 client | `false` | +| `storage.provider.metadata.storageMode` | the strategy Cryostat will use for storing files' metadata. The default 'tagging' strategy stores all metadata as object Tags. The 'metadata' strategy stores metadata as object Metadata, which is immutable but allows for more entries than Tags. The 'bucket' strategy stores metadata as separate files (ex. JSON object maps) in a dedicated bucket, with prefixes to differentiate the kind of object the metadata belongs to. | `tagging` | +| `storage.buckets.names.archivedRecordings` | the name of the storage bucket containing archived Flight Recordings | `archivedrecordings` | +| `storage.buckets.names.archivedReports` | the name of the storage bucket containing the Automated Analysis Report for archived Flight Recordings | `archivedreports` | +| `storage.buckets.names.eventTemplates` | the name of the storage bucket containing Custom Event Templates | `eventtemplates` | +| `storage.buckets.names.jmcAgentProbeTemplates` | the name of the storage bucket containing JMC Agent Probe Templates | `probes` | +| `storage.buckets.names.threadDumps` | the name of the storage bucket containing archived Thread Dumps | `threaddumps` | +| `storage.buckets.names.heapDumps` | the name of the storage bucket containing archived Heap Dumps | `heapdumps` | +| `storage.buckets.names.metadata` | the name of the storage bucket containing files' metadata. Only used if storage.provider.metadata.storageMode is set to 'bucket'. | `metadata` | +| `storage.encryption.enabled` | Enable at-rest encryption of stored objects. The storage container will generate a secret key for each stored object and use this key to encrypt and decrypt objects transparently. The key is written to the object metadata, so in the default storage container configuration this only adds a small layer of additional security. This is only used for the managed cryostat-storage instance and will have no effect if an external, unmanaged storage provider is configured. | `true` | +| `storage.podAnnotations` | Annotations to be applied to the Storage Pods | `{}` | +| `storage.service.type` | Type of Service to create for the object storage | `ClusterIP` | +| `storage.service.port` | Port number to expose on the Service | `8333` | +| `storage.service.annotations` | Annotations to be applied to the Service for the object storage | `{}` | +| `storage.resources.requests.cpu` | CPU resource request for the object storage container. See: [ResourceRequirements](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#resources) | `50m` | +| `storage.resources.requests.memory` | Memory resource request for the object storage container | `256Mi` | +| `storage.pvc.enabled` | Specify whether to use persistentVolumeClaim (true) or EmptyDir storage (false). This is recommended to be enabled, but the storage size and selector should be chosen carefully first | `false` | +| `storage.pvc.annotations` | Annotations to add to the persistentVolumeClaim | `{}` | +| `storage.pvc.storage` | Storage size to request for the persistentVolumeClaim | `500Mi` | +| `storage.pvc.accessModes` | Access mode for the persistentVolumeClaim. See: [Access Modes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) | `["ReadWriteOnce"]` | +| `storage.pvc.selector` | Selector for the persistentVolumeClaim. See: [Selector](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) | `{}` | +| `storage.pvc.storageClassName` | The name of the StorageClass for the persistentVolumeClaim. See: [Class](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims) | `undefined` | +| `storage.securityContext` | Security Context for the storage container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `storage.config.extra` | Extra configurations for the object storage container | | +| `storage.config.extra.envVars` | Extra environment variables for the object storage container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `storage.config.extra.envSources` | Sources for extra variables for the object storage container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `storage.nodeSelector` | Node Selector for the Storage Pod. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `storage.tolerations` | Tolerations for the Storage Pod. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | +| `storage.affinity` | Affinity for the Storage Pod. See: [Affinity](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | + +### Grafana Container + +| Name | Description | Value | +| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | +| `grafana` | Configuration for the customized Grafana instance for Cryostat | | +| `grafana.image.repository` | Repository for the Grafana container image | `quay.io/cryostat/cryostat-grafana-dashboard` | +| `grafana.image.pullPolicy` | Image pull policy for the Grafana container image | `Always` | +| `grafana.image.tag` | Tag for the Grafana container image | `latest` | +| `grafana.resources.requests.cpu` | CPU resource request for the Grafana container. See: [ResourceRequirements](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#resources) | `25m` | +| `grafana.resources.requests.memory` | Memory resource request for the Grafana container | `80Mi` | +| `grafana.securityContext` | Security Context for the Grafana container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `grafana.config.extra` | Extra configurations for the Grafana container | | +| `grafana.config.extra.envVars` | Extra environment variables for for the Grafana container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `grafana.config.extra.envSources` | Sources for extra variables for the Grafana container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `grafana.nodeSelector` | Node Selector for the Grafana Pod. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `grafana.tolerations` | Tolerations for the Grafana Pod. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | + +### JFR Data Source Container + +| Name | Description | Value | +| -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | +| `datasource` | Configuration for the JFR Data Source component, which translates recording events into a format consumable by Grafana | | +| `datasource.image.repository` | Repository for the JFR Data Source container image | `quay.io/cryostat/jfr-datasource` | +| `datasource.image.pullPolicy` | Image pull policy for the JFR Data Source container image | `Always` | +| `datasource.image.tag` | Tag for the JFR Data Source container image | `latest` | +| `datasource.resources.requests.cpu` | CPU resource request for the JFR Data Source container. See: [ResourceRequirements](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#resources) | `200m` | +| `datasource.resources.requests.memory` | Memory resource request for the JFR Data Source container | `200Mi` | +| `datasource.securityContext` | Security Context for the JFR Data Source container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `datasource.config.extra` | Extra configurations for the JFR Data Source container | | +| `datasource.config.extra.envVars` | Extra environment variables for for the JFR Data Source container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `datasource.config.extra.envSources` | Sources for extra variables for the JFR Data Source container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `datasource.nodeSelector` | Node Selector for the JFR Datasource Pod. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `datasource.tolerations` | Tolerations for the JFR Datasource Pod. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | + +### Authentication + +| Name | Description | Value | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------- | +| `authentication.cookieSecretName` | Name of the secret containing the authenticating proxy cookie encryption key. This secret must contain a COOKIE_SECRET secret which is the cookie encryption key. It must not be updated across chart upgrades, or else existing user login sessions will be invalidated. It is recommended that the secret should be marked as immutable to avoid accidental changes to secret's data. More details: https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable | `""` | +| `authentication.openshift.enabled` | Whether the OAuth Proxy deployed for securing Cryostat's Pods should be one that integrates with OpenShift-specific features, or a generic one | `false` | +| `authentication.openshift.clusterRole.name` | The name of the ClusterRole to bind for the OpenShift OAuth Proxy | `system:auth-delegator` | +| `authentication.basicAuth.enabled` | Whether Cryostat should use basic authentication for users. When false, Cryostat will not perform any form of authentication | `false` | +| `authentication.basicAuth.secretName` | Name of the Secret that contains the credentials within Cryostat's namespace **(Required if basicAuth is enabled)** | `""` | +| `authentication.basicAuth.filename` | Key within Secret containing the `htpasswd` file. The file should contain one user definition entry per line, with the syntax "user:passHash", where "user" is the username and "passHash" is the `bcrypt` hash of the desired password. Such an entry can be generated with ex. `htpasswd -nbB username password` **(Required if basicAuth is enabled)** | `""` | + +### OAuth2 Proxy + +| Name | Description | Value | +| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------- | +| `oauth2Proxy.image.repository` | Repository for the OAuth2 Proxy container image | `quay.io/oauth2-proxy/oauth2-proxy` | +| `oauth2Proxy.image.pullPolicy` | Image pull policy for the OAuth2 Proxy container image | `Always` | +| `oauth2Proxy.image.tag` | Tag for the OAuth2 Proxy container image | `latest` | +| `oauth2Proxy.tls.selfSigned.enabled` | Whether a self-signed TLS certificate for oauth2-proxy HTTPS is generated and used | `false` | +| `oauth2Proxy.resources.requests.cpu` | CPU resource request for the OAuth2 Proxy container | `25m` | +| `oauth2Proxy.resources.requests.memory` | Memory resource request for the OAuth2 Proxy container | `64Mi` | +| `oauth2Proxy.securityContext` | Security Context for the OAuth2 Proxy container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `oauth2Proxy.config.extra` | Extra configurations for the OAuth2 Proxy container | | +| `oauth2Proxy.config.extra.envVars` | Extra environment variables for the OAuth2 Proxy container. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `oauth2Proxy.config.extra.envSources` | Sources for extra variables for the OAuth2 Proxy container. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `oauth2Proxy.config.extra.inPod.main.envVars` | Extra environment variables for the OAuth2 Proxy container **only in the Cryostat main pod** | `[]` | +| `oauth2Proxy.config.extra.inPod.main.envSources` | Sources for extra variables for the OAuth2 Proxy container **only in the Cryostat main pod** | `[]` | +| `oauth2Proxy.config.extra.inPod.reports.envVars` | Extra environment variables for the OAuth2 Proxy container **only in the report generator pods** | `[]` | +| `oauth2Proxy.config.extra.inPod.reports.envSources` | Sources for extra variables for the OAuth2 Proxy container **only in the report generator pods** | `[]` | + +### OpenShift OAuth Proxy + +| Name | Description | Value | +| ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | +| `openshiftOauthProxy.image.repository` | Repository for the OpenShift OAuth Proxy container image | `quay.io/openshift/origin-oauth-proxy` | +| `openshiftOauthProxy.image.pullPolicy` | Image pull policy for the OpenShift OAuth Proxy container image | `Always` | +| `openshiftOauthProxy.image.tag` | Tag for the OpenShift OAuth Proxy container image | `latest` | +| `openshiftOauthProxy.resources.requests.cpu` | CPU resource request for the OpenShift OAuth Proxy container | `25m` | +| `openshiftOauthProxy.resources.requests.memory` | Memory resource request for the OpenShift OAuth Proxy container | `64Mi` | +| `openshiftOauthProxy.accessReview.enabled` | Whether the SubjectAccessReview/TokenAccessReview role checks for users and clients are enabled. If this is disabled then the proxy will only check that the user has valid credentials or holds a valid token | `true` | +| `openshiftOauthProxy.accessReview.group` | The OpenShift resource group that the SubjectAccessReview/TokenAccessReview will be performed for. See https://github.com/openshift/oauth-proxy/?tab=readme-ov-file#delegate-authentication-and-authorization-to-openshift-for-infrastructure | `""` | +| `openshiftOauthProxy.accessReview.resource` | The OpenShift resource that the SubjectAccessReview/TokenAccessReview will be performed for | `pods` | +| `openshiftOauthProxy.accessReview.subresource` | The OpenShift resource that the SubjectAccessReview/TokenAccessReview will be performed for | `exec` | +| `openshiftOauthProxy.accessReview.name` | The OpenShift resource name that the SubjectAccessReview/TokenAccessReview will be performed for | `""` | +| `openshiftOauthProxy.accessReview.namespace` | The OpenShift namespace that the SubjectAccessReview/TokenAccessReview will be performed for | `{{ .Release.Namespace }}` | +| `openshiftOauthProxy.accessReview.verb` | The OpenShift resource name that the SubjectAccessReview/TokenAccessReview will be performed for | `create` | +| `openshiftOauthProxy.accessReview.version` | The OpenShift resource version that the SubjectAccessReview/TokenAccessReview will be performed for | `""` | +| `openshiftOauthProxy.securityContext` | Security Context for the OpenShift OAuth Proxy container. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [SecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context-1) | `{}` | +| `openshiftOauthProxy.config.extra` | Extra configurations for the OpenShift OAuth Proxy | | +| `openshiftOauthProxy.config.extra.envVars` | Extra environment variables for the OpenShift OAuth Proxy. See: [Define Environment Variables](https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/) | `[]` | +| `openshiftOauthProxy.config.extra.envSources` | Sources for extra variables for the OpenShift OAuth Proxy. See: [Define Environment Variables From ConfigMap](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables) | `[]` | +| `openshiftOauthProxy.config.extra.inPod.main.envVars` | Extra environment variables for the OpenShift OAuth Proxy **only in the Cryostat main pod** | `[]` | +| `openshiftOauthProxy.config.extra.inPod.main.envSources` | Sources for extra variables for the OpenShift OAuth Proxy **only in the Cryostat main pod** | `[]` | +| `openshiftOauthProxy.config.extra.inPod.reports.envVars` | Extra environment variables for the OpenShift OAuth Proxy **only in the report generator pods** | `[]` | +| `openshiftOauthProxy.config.extra.inPod.reports.envSources` | Sources for extra variables for the OpenShift OAuth Proxy **only in the report generator pods** | `[]` | + +### Other Parameters + +| Name | Description | Value | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | +| `imagePullSecrets` | Image pull secrets to be used for the Cryostat deployment | `[]` | +| `nameOverride` | Overrides the name of this Chart | `""` | +| `fullnameOverride` | Overrides the fully qualified application name of `[release name]-[chart name]` | `""` | +| `rbac.create` | Specifies whether RBAC resources should be created | `true` | +| `serviceAccount.create` | Specifies whether a service account should be created | `true` | +| `serviceAccount.annotations` | Annotations to add to the service account | `{}` | +| `serviceAccount.name` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template | `""` | +| `podAnnotations` | Annotations to be applied to the various Pods | `{}` | +| `podSecurityContext` | Security Context for the Cryostat Pod. Defaults to meet "restricted" [Pod Security Standard](https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted). See: [PodSecurityContext](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context) | `{}` | +| `networkPolicy.ingress.enabled` | whether a NetworkPolicy for restricting Cryostat component Pods' traffic is installed. This prevents other Pods from sending unwanted traffic to Cryostat's Pods. Traffic should flow via the Service (or Route, or other Ingress) only, not by directly targeting Pods | `true` | +| `nodeSelector` | default Node Selector for the various Pods. Any Pod which does not have an individual nodeSelector setting will default to this. See: [NodeSelector](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | +| `tolerations` | default Tolerations for the various Pods. See: [Tolerations](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `[]` | +| `affinity` | default Affinity for the various Pods. See: [Affinity](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#scheduling) | `{}` | \ No newline at end of file diff --git a/docs/_subsections/configuring-the-operator.md b/docs/_subsections/configuring-the-operator.md index 8aa0b987..cac54a58 100644 --- a/docs/_subsections/configuring-the-operator.md +++ b/docs/_subsections/configuring-the-operator.md @@ -50,7 +50,7 @@ spec: Multiple templates can be specified in the `eventTemplates` array. Each `configMapName` must refer to the name of a **Config Map** in the same namespace as **Cryostat**. The corresponding `filename` must be a key within that **Config Map** containing the template file. ### Trusted TLS Certificates -By default, **Cryostat** uses TLS when connecting to the user's applications over JMX. In order to verify the identity of the applications **Cryostat** connects to, it should be configured to trust the TLS certificates presented by those applications. One way to do that is to specify certificates that **Cryostat** should trust in the `spec.trustedCertSecrets` property. +By default, **Cryostat** uses TLS when connecting to the user's applications over JMX. In order to verify the identity of the applications **Cryostat** connects to, it should be configured to trust the TLS certificates presented by those applications. Certificates can be provided through the `spec.trustedCertSecrets` property, and each entry may reference either a **Secret** or a **ConfigMap** in the same namespace as the `Cryostat` object. ```yaml apiVersion: operator.cryostat.io/v1beta2 kind: Cryostat @@ -60,8 +60,12 @@ spec: trustedCertSecrets: - secretName: my-tls-secret certificateKey: ca.crt + - configMapName: my-service-ca + certificateKey: service-ca.crt ``` -Multiple TLS secrets may be specified in the `trustedCertSecrets` array. The `secretName` property is mandatory, and must refer to the name of a Secret within the same namespace as the `Cryostat` object. The `certificateKey` must point to the X.509 certificate file to be trusted. If `certificateKey` is omitted, the default key name of `tls.crt` will be used. +Multiple certificate entries may be specified in the `trustedCertSecrets` array. Each entry must specify exactly one of `secretName` or `configMapName`. The `certificateKey` must point to the X.509 certificate or CA bundle file to be trusted. If `certificateKey` is omitted, the default key name is `tls.crt` for **Secrets** and `service-ca.crt` for **ConfigMaps**. + +The `configMapName` option is useful on **OpenShift**, where service serving certificate CA bundles are commonly injected into **ConfigMap** resources. In that case, the injected certificate bundle normally uses the `service-ca.crt` key, so you can omit `certificateKey` when using that default key name. ### Storage Options **Cryostat** uses storage volumes to persist data in its database and object storage. In the interest of persisting these files across redeployments, **Cryostat** uses a **Persistent Volume Claim** by default. Unless overidden, the operator will create a **Persistent Volume Claim** with the default **Storage Class** and **500MiB** of storage capacity. @@ -302,6 +306,23 @@ spec: targetCacheTTL: 10 ``` +### Audit Logging + +**Cryostat** can persist audit history in its database. This history enables features that refer back to information about target applications and their Kubernetes lineages after those targets are no longer discoverable. + +The `spec.enableAudit` property configures audit logging for the **Cryostat** application. For newly created `Cryostat` objects, the **Cryostat Operator** defaults `spec.enableAudit` to `true`. Existing `Cryostat` objects created before this field was introduced keep their previous behavior until you explicitly set the property. + +When audit logging is enabled, the **Cryostat** database grows over time and might require additional storage. + +```yaml +apiVersion: operator.cryostat.io/v1beta2 +kind: Cryostat +metadata: + name: cryostat-sample +spec: + enableAudit: false +``` + ### Application Database **Cryostat** stores various pieces of information in a database. This can also include target application connection credentials, such as target applications' JMX credentials, which are stored in an encrypted database table. By default, the **Cryostat Operator** will generate both a random database connection key and a random table encryption key and configure **Cryostat** and the database to use these. You may also specify these keys yourself by creating a Secret containing the keys `CONNECTION_KEY` and `ENCRYPTION_KEY`. diff --git a/docs/_subsections/operator-architecture.md b/docs/_subsections/operator-architecture.md index 1d398a0f..2ddd333a 100644 --- a/docs/_subsections/operator-architecture.md +++ b/docs/_subsections/operator-architecture.md @@ -51,16 +51,43 @@ With this setup, the target applications are not able to assume the privileges a ### [Agent Autoconfiguration](#agent-autoconfiguration) -Using labels on a Deployment's .spec.template.metadata.labels field, a user can request the **Cryostat Operator** to patch their application Deployment to add and configure the **Cryostat Agent**. The two required labels are cryostat.io/namespace and cryostat.io/name. These should be populated with values corresponding to the installation namespace of a **Cryostat Custom Resource** that the user wishes their application to be registered with. The **Cryostat Operator** will validate that the application Deployment belongs to one of the Target Namespaces of the **Cryostat CR**, and ignore the request if it does not. The patching done by the **Cryostat Operator** involves mounting volumes to the Deployment's Pods containing the **Cryostat Agent** JAR and various TLS certificates required for secure communications; patching the JAVA_TOOL_OPTIONS environment variable to append the -javaagent:/path/to/cryostat-agent.jar flag so that the application statically attaches the **Cryostat Agent** at startup; and adding additional environment variables to the Deployment to configure the **Cryostat Agent** to load the TLS certificates, determine its own callback URL, and to communicate with the **Cryostat Agent** Service in its own Namespace. The **Cryostat Operator** places an Agent Service in each Target namespace, which points at the **Agent Proxy (Gateway)** component of the associated **Cryostat** instance. +Using labels on a Deployment's metadata.labels or .spec.template.metadata.labels field, a user can request the **Cryostat Operator** to patch their application Deployment to add and configure the **Cryostat Agent**. The two required labels are cryostat.io/namespace and cryostat.io/name. These should be populated with values corresponding to the installation namespace of a **Cryostat Custom Resource** that the user wishes their application to be registered with. The **Cryostat Operator** will validate that the application Deployment belongs to one of the Target Namespaces of the **Cryostat CR**, and ignore the request if it does not. The patching done by the **Cryostat Operator** involves mounting volumes to the Deployment's Pods containing the **Cryostat Agent** JAR and various TLS certificates required for secure communications; patching the JAVA_TOOL_OPTIONS environment variable to append the -javaagent:/path/to/cryostat-agent.jar flag so that the application statically attaches the **Cryostat Agent** at startup; and adding additional environment variables to the Deployment to configure the **Cryostat Agent** to load the TLS certificates, determine its own callback URL, and to communicate with the **Cryostat Agent** Service in its own Namespace. The **Cryostat Operator** places an Agent Service in each Target namespace, which points at the **Agent Proxy (Gateway)** component of the associated **Cryostat** instance. The environment variable selection can be modified using the cryostat.io/java-options-var label. This defaults to JAVA_TOOL_OPTIONS as described above. +Starting with **Cryostat** 4.2, the Agent Autoconfiguration labels can be applied to the application's Deployment directly, rather than just the Pod Template. + If the Deployment template describes a Pod containing more than one container, the cryostat.io/container can be used to select a container by name. This container will be the one configured to use the **Cryostat Agent**. If this is not specified, the **Operator** will default to picking the first container within the Pod. The label cryostat.io/read-only can be used to configure the injected **Cryostat Agent** instance to only accept "read" requests on its internal webserver. The **Cryostat Agent** will permit the **Cryostat** instance to perform actions such as querying for the list of active **Flight Recordings**, or the list of registered **JFR** Event Types, or reading MBean metrics. The agent will reject actions such as starting new **Flight Recordings**. The label cryostat.io/callback-port can be used to control the HTTPS port exposed by the **Cryostat Agent** instance, which is how the **Agent** receives requests from the **Cryostat** instance. This defaults to 9977. If this port number is already used by the application or has some other meaning within the larger deployment, then this label can be used to change the **Cryostat Agent** HTTPS port number. +The label cryostat.io/smart-triggers can be used to attach Smart Triggers to a target application. This label specifies a list of config maps containing Smart Trigger definitions. These config maps will be mounted to the target Pod and a startup flag will be set with the agent to read and enable them. See [using smart triggers](/guides/#using-smart-triggers) for more information on Smart Triggers + +There are also several labels for configuring the agent harvester through Agent Autoconfiguration. The label cryostat.io/harvester-template can be used to specify a recording template for use when starting an agent harvester recording. The labels cryostat.io/harvester-period and cryostat.io/harvester-max-files can be used to specify the length of time between JFR collections and pushes by the harvester, and the maximum number of pushed files that Cryostat will keep from the agent respectively. See [configuring the agent harvester](/docs/#configure-the-agent-harvester) for more information on configuring the agent harvester. + +### [Agent Autoconfiguration with the Console Plugin](#agent-autoconfiguration-with-the-console-plugin) + +The **Cryostat Console Plugin** contains a graphical wizard for registering targets with **Cryostat** through the **Agent Autoconfiguration** feature. + +
    +
  1. + {% include howto_step.html + summary="Select a target in the topology view to register." + image-name="4.2.0/agent-autoconfiguration-wizard-1.png" + caption="Select the 'Register with Cryostat' option. This will open the graphical wizard for Agent Autoconfiguration." + %} +
  2. +
  3. + {% include howto_step.html + summary="Fill out the required fields in the wizard" + image-name="4.2.0/agent-autoconfiguration-wizard-2.png" + caption="After filling out the wizard with the available Agent Autoconfiguration options, review the configuration and select Register. Agent Autoconfiguration will then be performed with the selected options and the target will be registered with Cryostat" + %} +
  4. +
+ ### [Flow of JFR Data](#flow-of-jfr-data) **Cryostat** traditonally connects to other **JVM** applications within its cluster using remote JMX, using cluster-internal URLs so that no traffic will leave the cluster. **Cryostat** supports connecting to target **JVMs** with JMX auth credentials enabled ("Basic" style authentication). When a connection attempt to a target fails due to a SecurityException, Cryostat responds to the requesting client with an HTTP 427 status code and the header X-JMX-Authenticate: Basic. The client is expected to create a [Stored Credential](/guides/#store-credentials) object via the **Cryostat API** before retrying the request, which results in the required target credentials being stored in an encrypted database table. When deployed in **OpenShift** the requests are already encrypted using **OpenShift** TLS re-encryption as mentioned above, so the credentials are never transmitted in cleartext. The table is encrypted with a passphrase either provided by the user at deployment time, or generated by the **Operator** if none is specified. It is also possible to configure **Cryostat** to trust SSL certificates used by target JVMs by adding the certificate to a Secret and linking that to the **Cryostat CR**, which will add the certificate to the SSL trust store used by **Cryostat**. The Operator also uses **cert-manager** to generate a self-signed CA and provides **Cryostat's** auth proxy with certificates as a mounted volume. For more information on setting this up, see [Configuring the Operator](/docs/#configure-the-cryostat-operator) diff --git a/docs/_subsections/using-the-cryostat-agent.md b/docs/_subsections/using-the-cryostat-agent.md index 6713a21a..069a0ebf 100644 --- a/docs/_subsections/using-the-cryostat-agent.md +++ b/docs/_subsections/using-the-cryostat-agent.md @@ -8,6 +8,8 @@ The **Agent** may also be configured, using the property `cryostat.agent.api.wri The programming interfaces for **Cryostat** and its **Agent** are designed to implement **Cryostat's** specific feature set, rather than being generalized and flexible like **JMX**. The benefit of this is that the security considerations are easier to understand and model, but choosing to use the **Cryostat Agent** over **JMX** may also forego the ability to interoperate with other **JMX** tooling such as `JDK Mission Control`, `visualvm`, `jconsole`, `hawtio`, etc. +Note that cryostat.agent.baseuri and cryostat.agent.callback are required properties. These ensure that the agent can communicate with Cryostat and Cryostat can communicate back to the agent. +
  1. The Cryostat Agent retrieves a wide range of information from those Cryostat applications such as memory usage, CPU utilization, etc.
  2. The Cryostat analyzes these collected data to identify problems that might be affecting the application’s performance.
  3. diff --git a/docs/index.md b/docs/index.md index 2c2f2624..34a45543 100644 --- a/docs/index.md +++ b/docs/index.md @@ -16,6 +16,8 @@ title: Cryostat Documentation {% include_relative _subsections/external-storage.md %} +{% include_relative _subsections/configuring-the-helm-chart.md %} + # Additional Information {% include_relative _subsections/operator-architecture.md %} diff --git a/get-started/index.md b/get-started/index.md index 95a0a81a..1dcab83d 100644 --- a/get-started/index.md +++ b/get-started/index.md @@ -78,6 +78,37 @@ Click "*Install*" and wait for the installation to complete. Continue to [Setup](#setup). +### [Install via Helm Chart](#install-via-helm-chart) + +**Cryostat** can also be installed through the helm chart. Note that installing **Cryostat** through the helm chart comes with several limitations to be aware of. The helm chart will install **Cryostat** directly without the **Cryostat Operator** to manage it. The helm chart also does not integrate with cert-manager. When installed through the helm chart, the Agent Auto Configuration feature will not work since it requires the **Cryostat Operator**. Finally, the **Openshift Console Plugin** will not be installed by the helm chart. For more information on configuring the helm chart including configuring TLS, see [Configuring the Helm Chart](/docs/#configure-the-cryostat-helm-chart) + +#### From Helm repository + +The chart is available at the following repositories: + +- https://cryostat.io/helm-charts +- https://charts.openshift.io + +To install the chart, add the repository and install, for example: + +```bash +helm repo add cryostat-charts https://cryostat.io/helm-charts +helm repo update +helm install cryostat cryostat-charts/cryostat +``` + +#### From OCI container registry + +The chart is also available as an OCI image on GitHub Container Registry (`ghcr.io`). + +To install the chart, run: + +```bash +helm install cryostat oci://ghcr.io/cryostatio/cryostat-helm --version $VERSION +``` + +Continue to [Setup](#setup). + ## [Setup](#setup) ### [Deploying Cryostat](#deploying-cryostat) diff --git a/guides/_subsections/add-a-trusted-certificate.md b/guides/_subsections/add-a-trusted-certificate.md index 26bf84a5..fad5fe2c 100644 --- a/guides/_subsections/add-a-trusted-certificate.md +++ b/guides/_subsections/add-a-trusted-certificate.md @@ -5,7 +5,7 @@ If you have Java Management Extensions **(JMX)** over `SSL` enabled on your cont
  4. {% include howto_step.html summary="Navigate to the Security Tab" - image-name="4.1.0/navigate-to-security.png" + image-name="4.2.0/navigate-to-security.png" text="Click the Security tab. This should initially be in an empty state if you have not yet defined any additional trusted certificates." %}
  5. @@ -26,11 +26,13 @@ certificate(s) within the truststore directory. ### [Preconfiguring Trusted Certificates within Cryostat](#preconfiguring-trusted-certificates-within-cryostat) -Alternatively if deploying **Cryostat** in a **Kubernetes** environment with the **Cryostat Operator**, TLS Certs can be preconfigured in **Cryostat** when creating the custom resource. To begin, create a **Kubernetes** Secret containing the TLS Cert. +Alternatively if deploying **Cryostat** in a **Kubernetes** environment with the **Cryostat Operator**, TLS certificates can be preconfigured in **Cryostat** when creating the custom resource. To begin, create a **Kubernetes** Secret or **ConfigMap** containing the TLS certificate or CA bundle. ```kubectl create secret generic application-cert --from-file=tlsCert.crt``` -Now that this Secret has been created, when creating the **Cryostat Custom Resource** we can specify it, either through the **Red Hat Openshift** console under **Trusted TLS Certificates** while creating the **Cryostat Custom Resource**, or through the **Custom Resource** YAML: +```kubectl create configmap application-ca --from-file=service-ca.crt``` + +Now that this Secret or ConfigMap has been created, when creating the **Cryostat Custom Resource** we can specify it, either through the **Red Hat OpenShift** console under **Trusted TLS Certificates** while creating the **Cryostat Custom Resource**, or through the **Custom Resource** YAML: ```yaml apiVersion: operator.cryostat.io/v1beta2 @@ -41,6 +43,10 @@ spec: trustedCertSecrets: - secretName: application-cert certificateKey: tlsCert.crt + - configMapName: application-ca + certificateKey: service-ca.crt ``` -Once the **Custom Resource** has been created, the TLS Certificate will be pre-loaded into **Cryostat** and be available from startup without any further configuration needed. +Each `trustedCertSecrets` entry must specify exactly one of `secretName` or `configMapName`. If `certificateKey` is omitted, the default key name is `tls.crt` for Secrets and `service-ca.crt` for ConfigMaps. The ConfigMap default is useful for OpenShift service CA bundles. + +Once the **Custom Resource** has been created, the TLS certificate will be pre-loaded into **Cryostat** and be available from startup without any further configuration needed. diff --git a/guides/_subsections/add-and-edit-recording-metadata-labels.md b/guides/_subsections/add-and-edit-recording-metadata-labels.md index 688f0efb..9b0d222b 100644 --- a/guides/_subsections/add-and-edit-recording-metadata-labels.md +++ b/guides/_subsections/add-and-edit-recording-metadata-labels.md @@ -11,7 +11,7 @@ Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` ma
  6. {% include howto_step.html summary="Add Metadata Labels to the Create Recording form" - image-name="4.1.0/add-and-edit-recording-metadata-labels-1.png" + image-name="4.2.0/add-and-edit-recording-metadata-labels-1.png" text=" When creating a custom Flight Recording with Cryostat, expand the form section Show metadata options. Click Add Label and add key-Value Label pairs to the form. Finally, click Create to attach the Labels and create the Recording. " @@ -20,7 +20,7 @@ Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` ma
  7. {% include howto_step.html summary="View your Labels on the Active Recordings Table" - image-name="4.1.0/add-and-edit-recording-metadata-labels-2.png" + image-name="4.2.0/add-and-edit-recording-metadata-labels-2.png" text=" The new Recording will appear in the Recordings Tab with your Custom Label as well as default Labels containing information about the selected Recording template. " @@ -34,14 +34,14 @@ Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` ma {% endcapture %} {% include howto_step.html summary="Edit an Existing Label" - image-name="4.1.0/add-and-edit-recording-metadata-labels-3.png" + image-name="4.2.0/add-and-edit-recording-metadata-labels-3.png" text=edit-an-existing-label-text %}
  8. {% include howto_step.html summary="View your edited Labels" - image-name="4.1.0/add-and-edit-recording-metadata-labels-4.png" + image-name="4.2.0/add-and-edit-recording-metadata-labels-4.png" text=" The Recording Labels should be updated in the Active Recordings table. " @@ -50,7 +50,7 @@ Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` ma
  9. {% include howto_step.html summary="(Optional) Archive your Recording to view Labels copied onto the Archived Recording" - image-name="4.1.0/add-and-edit-recording-metadata-labels-5.png" + image-name="4.2.0/add-and-edit-recording-metadata-labels-5.png" text=" On the Active Recordings table, click the Checkbox next to the Recording, then click Archive to archive your Recording. Notice that the Archived Recording also copies the Labels from the Active Recording. You can also add Labels to any Recording uploaded to Cryostat’s archives. " @@ -61,8 +61,8 @@ Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` ma

    Create another Recording on the same target. Then select both Recordings on the Recordings Table and click Edit Labels and start editing. This time, only Labels that are present on both Recordings will be shown in the form. Let's Delete the two common template-related Labels, and Add a new Label to both Recordings. Then finally, click Save.

    - - + +

    Congratulations, you have successfully bulk-edited Labels across multiple Recordings! @@ -70,7 +70,7 @@ Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` ma {% endcapture %} {% include howto_step.html summary="(Optional) Bulk-edit Recording Labels across multiple Recordings" - image-name="4.1.0/add-and-edit-recording-metadata-labels-6.png" + image-name="4.2.0/add-and-edit-recording-metadata-labels-6.png" text=bulk-edit-recording-labels-text %}

  10. diff --git a/guides/_subsections/analyze-a-thread-dump.md b/guides/_subsections/analyze-a-thread-dump.md new file mode 100644 index 00000000..0a092151 --- /dev/null +++ b/guides/_subsections/analyze-a-thread-dump.md @@ -0,0 +1,46 @@ +## [Analyze a Thread Dump](#analyze-a-thread-dump) +
      +
    1. +

      + The Visualize Thread Dumps page + allows you to visualize captured thread dumps from a target JVM, looking for common problems + and analyzing for deadlocks. Thread Dumps can be analyzed from the archives or selected from a dropdown. +

      +
    2. +
    3. + {% include howto_step.html + summary="Select a Thread Dump" + image-name="4.2.0/analyze-a-thread-dump-1.png" + caption=" + The dropdown menu will be populated with Thread Dumps from the archives for the currently selected target. If there are no Thread Dumps to source data from, capture one then return back to this view. For more information on capturing Thread Dumps, see Capture a Thread Dump. + " + %} +
    4. +
    5. + {% include howto_step.html + summary="Request analysis" + image-name="4.2.0/analyze-a-thread-dump-2.png" + caption=" + Click the analysis process button in the corner of the drawer panel. + " + %} +
    6. +
    7. + {% include howto_step.html + summary="View aggregated data" + image-name="4.2.0/analyze-a-thread-dump-3.png" + caption=" + Once a thread dump has been selected the view will be populated with the analyzed data. There are pie charts displaying aggregation by thread state, running methods, and lock instances. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="View detailed thread information" + image-name="4.2.0/analyze-a-thread-dump-4.png" + caption=" + Once a thread dump has been selected the view will be populated with the analyzed data. There is as a table for specific patterns found in the data, and deadlocks detected as well as detailed thread information. The specific findings looks for patterns in the captured thread dump that indicate common problems, for instance concurrency issues with logging. The deadlock detection table displays threads that are deadlocked as well as the objects that they are waiting for. The rows can be expanded to show the stack trace of the deadlocked thread and any locks held by that thread. The thread information table shows detailed thread information including the thread’s ID and native ID, priority, state, whether it is a daemon thread, and the CPU time used. Rows can similarly be expanded to view the stack trace and lock instances held by the thread. + " + %} +
    10. +
    \ No newline at end of file diff --git a/guides/_subsections/archive-a-recording.md b/guides/_subsections/archive-a-recording.md index e3087f86..9adfcb09 100644 --- a/guides/_subsections/archive-a-recording.md +++ b/guides/_subsections/archive-a-recording.md @@ -29,7 +29,7 @@ any state (`RUNNING`, `STOPPED`, etc.), and may even be a `snapshot`. {% endcapture %} {% include howto_step.html summary="Select an Active Recording" - image-name="4.1.0/archive-a-recording-1.png" + image-name="4.2.0/archive-a-recording-1.png" caption=select-recording-additional-content %} @@ -54,7 +54,7 @@ any state (`RUNNING`, `STOPPED`, etc.), and may even be a `snapshot`.
  11. {% include howto_step.html summary="Navigate to the Flight Recorder/Analyze/Archives view" - image-name="4.1.0/archive-a-recording-2.png" + image-name="4.2.0/archive-a-recording-2.png" caption=archives-view-caption text=archives-view-text %} diff --git a/guides/_subsections/automated-analysis.md b/guides/_subsections/automated-analysis.md index ecf68da3..62db68f9 100644 --- a/guides/_subsections/automated-analysis.md +++ b/guides/_subsections/automated-analysis.md @@ -19,7 +19,7 @@ Read the section on the [`Automated Analysis Card`](#automated-analysis-card) fo
  12. {% include howto_step.html summary="Click the Analyze toolbar button" - image-name="4.1.0/automated-analysis-1.png" + image-name="4.2.0/automated-analysis-1.png" caption=" The analysis drawer will appear from the side. If Cryostat has already analyzed recording data from this target recently then content will appear in the drawer. If there are no Active Recordings @@ -31,7 +31,7 @@ Read the section on the [`Automated Analysis Card`](#automated-analysis-card) fo
  13. {% include howto_step.html summary="Request analysis" - image-name="4.1.0/automated-analysis-2.png" + image-name="4.2.0/automated-analysis-2.png" caption=" Click the analysis process button in the corner of the drawer panel. " @@ -40,7 +40,7 @@ Read the section on the [`Automated Analysis Card`](#automated-analysis-card) fo
  14. {% include howto_step.html summary="View Details and Suggestions for Results" - image-name="4.1.0/automated-analysis-3.png" + image-name="4.2.0/automated-analysis-3.png" caption=" Click on each result to view specifics on what the result means and possible suggestions to fix the potential problem. @@ -51,7 +51,7 @@ Read the section on the [`Automated Analysis Card`](#automated-analysis-card) fo

    {% include howto_step.html summary="View analysis of an archived recording" - image-name="4.1.0/automated-analysis-4.png" + image-name="4.2.0/automated-analysis-4.png" caption=" Automated analysis results for individual Archived Recordings are also available. " diff --git a/guides/_subsections/capture-a-heap-dump.md b/guides/_subsections/capture-a-heap-dump.md index 9e56dd54..786d891c 100644 --- a/guides/_subsections/capture-a-heap-dump.md +++ b/guides/_subsections/capture-a-heap-dump.md @@ -18,7 +18,7 @@ {% endcapture %} {% include howto_step.html summary="Navigate to the Diagnostics/Capture Page" - image-name="4.1.0/capture-diagnostics-page.png" + image-name="4.2.0/capture-diagnostics-page.png" caption="Click on Diagnostics/Capture on the sidebar." text=capture-a-heap-dump-text %} @@ -29,7 +29,7 @@

  15. {% include howto_step.html summary="Navigate to the Diagnostics/Analyze/Heap Dumps view" - image-name="4.1.0/archive-a-heap-dump.png" + image-name="4.2.0/archive-a-heap-dump.png" caption=" Once the Heap Dump has been archived, a new entry will appear in the target JVM's Heap Dumps table. All Heap Dumps that were diff --git a/guides/_subsections/capture-a-thread-dump.md b/guides/_subsections/capture-a-thread-dump.md index dc811823..673529b0 100644 --- a/guides/_subsections/capture-a-thread-dump.md +++ b/guides/_subsections/capture-a-thread-dump.md @@ -18,7 +18,7 @@ {% endcapture %} {% include howto_step.html summary="Navigate to the Diagnostics/Capture Page" - image-name="4.1.0/capture-diagnostics-page.png" + image-name="4.2.0/capture-diagnostics-page.png" caption="Click on Diagnostics/Capture on the sidebar." text=capture-a-thread-dump-text %} @@ -28,8 +28,8 @@
  16. {% include howto_step.html - summary="Navigate to the Diagnostics/Analyze/Thread Dumps view" - image-name="4.1.0/archive-a-thread-dump.png" + summary="Navigate to the Diagnostics/Analyze/Thread Dump Archives view" + image-name="4.2.0/archive-a-thread-dump.png" caption=" Once the Thread Dump has been archived, a new entry will appear in the target JVM's Thread Dumps table. All Thread Dumps that were diff --git a/guides/_subsections/common/card-catalog.md b/guides/_subsections/common/card-catalog.md index 23d7b165..88e23c19 100644 --- a/guides/_subsections/common/card-catalog.md +++ b/guides/_subsections/common/card-catalog.md @@ -3,7 +3,7 @@ {% endcapture %} {% include howto_step.html summary="Open the Card Catalog" - image-name="4.1.0/dashboard/card-catalog.png" + image-name="4.2.0/dashboard/card-catalog.png" caption="Open the Card Catalog by clicking the Catalog icon on the Dashboard toolbar." text=card-catalog-include-text %} diff --git a/guides/_subsections/common/click-create.md b/guides/_subsections/common/click-create.md index 0bb4c7f5..86810739 100644 --- a/guides/_subsections/common/click-create.md +++ b/guides/_subsections/common/click-create.md @@ -1,4 +1,4 @@ {% include howto_step.html summary="Click Create" - image-name="4.1.0/click-create.png" + image-name="4.2.0/click-create.png" %} diff --git a/guides/_subsections/common/layout-selector.md b/guides/_subsections/common/layout-selector.md index bb3b4d2d..d5080e68 100644 --- a/guides/_subsections/common/layout-selector.md +++ b/guides/_subsections/common/layout-selector.md @@ -3,7 +3,7 @@ The Layout Selector contains a list of all available layouts. The current {% endcapture %} {% include howto_step.html summary="Open the Layout Selector Dropdown" -image-name="4.1.0/dashboard/dashboard-layoutselector.png" +image-name="4.2.0/dashboard/dashboard-layoutselector.png" caption="Click the layout selector dropdown to view the available layouts." text=layout-selector-text %} diff --git a/guides/_subsections/common/navigate-to-dashboard.md b/guides/_subsections/common/navigate-to-dashboard.md index 0de6d0f3..794ae82c 100644 --- a/guides/_subsections/common/navigate-to-dashboard.md +++ b/guides/_subsections/common/navigate-to-dashboard.md @@ -3,7 +3,7 @@ {% endcapture %} {% include howto_step.html summary="Navigate to Overview/Dashboard" - image-name="4.1.0/navigate-to-dashboard.png" + image-name="4.2.0/navigate-to-dashboard.png" caption="Add dashboard cards, switch between dashboard layouts, and modify the layout configuration to suit your needs." text=navigate-to-dashboard-include-text %} diff --git a/guides/_subsections/common/navigate-to-recordings.md b/guides/_subsections/common/navigate-to-recordings.md index b88c63e1..e1eb735c 100644 --- a/guides/_subsections/common/navigate-to-recordings.md +++ b/guides/_subsections/common/navigate-to-recordings.md @@ -3,14 +3,14 @@ necessary to add the target's certificate to Cryostat's trust store. Go to Add a Trusted Certificate and return to this section after completing that guide. - - + + {{ include.additional-content }} {% endcapture %} {% include howto_step.html summary="Navigate to Flight Recorder/Capture/Recordings" - image-name="4.1.0/navigate-to-recordings-1.png" + image-name="4.2.0/navigate-to-recordings-1.png" caption=" Supply JMX credentials to authenticate to the target, if necessary. If the target is not configured with JMX authentication then the diff --git a/guides/_subsections/common/navigate-to-settings.md b/guides/_subsections/common/navigate-to-settings.md index 691ec604..ec845aa0 100644 --- a/guides/_subsections/common/navigate-to-settings.md +++ b/guides/_subsections/common/navigate-to-settings.md @@ -6,7 +6,7 @@ {% endcapture %} {% include howto_step.html summary="Navigate to Settings" - image-name="4.1.0/navigate-to-settings.png" + image-name="4.2.0/navigate-to-settings.png" caption=" Click the cog or gear icon in the application masthead to access the Settings view. " diff --git a/guides/_subsections/common/navigate-to-topology.md b/guides/_subsections/common/navigate-to-topology.md index 92149524..501426a5 100644 --- a/guides/_subsections/common/navigate-to-topology.md +++ b/guides/_subsections/common/navigate-to-topology.md @@ -3,7 +3,7 @@ {% endcapture %} {% include howto_step.html summary="Navigate to Overview/Topology" - image-name="4.1.0/navigate-to-topology.png" + image-name="4.2.0/navigate-to-topology.png" caption="Use the bottom Control Bar to adjust the Graph View as needed." text=navigate-to-topology-include-text %} diff --git a/guides/_subsections/common/select-a-recording.md b/guides/_subsections/common/select-a-recording.md index f0eaca84..110b8fe4 100644 --- a/guides/_subsections/common/select-a-recording.md +++ b/guides/_subsections/common/select-a-recording.md @@ -6,7 +6,7 @@ {% endcapture %} {% include howto_step.html summary="Select a Recording" - image-name="4.1.0/select-a-recording.png" + image-name="4.2.0/select-a-recording.png" caption=caption-content text=text-content %} diff --git a/guides/_subsections/common/select-target-application.md b/guides/_subsections/common/select-target-application.md index b2851638..7bdb86d3 100644 --- a/guides/_subsections/common/select-target-application.md +++ b/guides/_subsections/common/select-target-application.md @@ -8,7 +8,7 @@ {% endcapture %} {% include howto_step.html summary="Select the Target Application" - image-name="4.1.0/select-target-application.png" + image-name="4.2.0/select-target-application.png" caption="Clik the Dropdown arrow on the right side of Target prompt to select or create a target." text=text-content %} diff --git a/guides/_subsections/configure-feature-level.md b/guides/_subsections/configure-feature-level.md index 82ef6d07..2bffabb0 100644 --- a/guides/_subsections/configure-feature-level.md +++ b/guides/_subsections/configure-feature-level.md @@ -10,7 +10,7 @@ For those reasons, *Beta* features are hidden by default in the **Cryostat** UI.
  17. {% include howto_step.html summary="Locate the Advanced settings" - image-name="4.1.0/advanced-setting.png" + image-name="4.2.0/advanced-setting.png" text=" The Advanced tab within this view contains a control to set the Feature Level of the UI. This is set to Production by default. You can enable additional features by setting this to Beta, with the aforementioned caveats in mind. Once this is set, a Beta badge will appear on the Cryostat application titlebar. Additional features enabled by this setting, such as Dashboard cards, will be labelled with a similar badge to indicate the feature level. If you set the feature level back to Production then any Beta-level features will be hidden from the UI again. " diff --git a/guides/_subsections/configure-graphical-notifications.md b/guides/_subsections/configure-graphical-notifications.md index 88e911d6..772f1b14 100644 --- a/guides/_subsections/configure-graphical-notifications.md +++ b/guides/_subsections/configure-graphical-notifications.md @@ -12,7 +12,7 @@ the **web-client** graphical console can become quite noisy.
  18. {% include howto_step.html summary="Locate the Notifications Setting" - image-name="4.1.0/notifications-setting.png" + image-name="4.2.0/notifications-setting.png" text=" The Notifications setting within this view is used to control the graphical display of notifications that correspond to WebSocket messages sent by the Cryostat backend when actions and state changes occur. The setting diff --git a/guides/_subsections/create-a-custom-target.md b/guides/_subsections/create-a-custom-target.md index 214695ca..42c5c00b 100644 --- a/guides/_subsections/create-a-custom-target.md +++ b/guides/_subsections/create-a-custom-target.md @@ -20,8 +20,8 @@ without going through the network stack. Search for Custom Target tab and click Create to open the Custom Target form.
    - - + +
    Use the Custom Target form to tell Cryostat about JVM @@ -32,7 +32,7 @@ without going through the network stack. {% endcapture %} {% include howto_step.html summary="Open the Custom Target Form" - image-name="4.1.0/topology-7.png" + image-name="4.2.0/topology-7.png" caption="Click on Catalog Icon to open the Topology Entity Catalog." text=open-custom-target-form-text %} @@ -40,7 +40,7 @@ without going through the network stack.
  19. {% include howto_step.html summary="Enter Custom Target Definition" - image-name="4.1.0/custom-target-2.png" + image-name="4.2.0/custom-target-2.png" caption="Use the form to enter the Custom Target definition." text=" The Connection URL is required for Cryostat to attempt to @@ -55,8 +55,8 @@ without going through the network stack. Once you enter a valid Connection URL, click on the sample node to test the target connection.
    - - + +
    An exclamation mark and an alert banner will show if an error @@ -75,7 +75,7 @@ without going through the network stack. {% endcapture %} {% include howto_step.html summary="Test the Custom Target Definition" - image-name="4.1.0/custom-target-3.png" + image-name="4.2.0/custom-target-3.png" caption="A ✅ checkmark will show if Cryostat can connect to the sample app." text=test-custom-target-text %} @@ -87,7 +87,7 @@ without going through the network stack.
  20. {% include howto_step.html summary="View the Custom Targets" - image-name="4.1.0/custom-target-5.png" + image-name="4.2.0/custom-target-5.png" caption="The Custom Target will be available under Custom Targets realm." text=" Once the Custom Target form is successfully submitted, you @@ -99,7 +99,7 @@ without going through the network stack.
  21. {% include howto_step.html summary="(Optional) Delete Custom Targets" - image-name="4.1.0/custom-target-6.png" + image-name="4.2.0/custom-target-6.png" caption="Custom Targets can be cleaned up with Actions menu." text=" If the Custom Targets is no longer needed, in the target detail diff --git a/guides/_subsections/create-an-automated-rule.md b/guides/_subsections/create-an-automated-rule.md index 33077bfe..dcc5da2d 100644 --- a/guides/_subsections/create-an-automated-rule.md +++ b/guides/_subsections/create-an-automated-rule.md @@ -17,16 +17,16 @@ Previously, if we wanted to enable always-on `Continuous` monitoring using **JDK
  22. {% include howto_step.html summary="Navigate to the Flight Recorder/Capture/Automated Rules Tab" - image-name="4.1.0/create-an-automated-rule-1.png" + image-name="4.2.0/create-an-automated-rule-1.png" %}
  23. - Click the Create Button + Click Create to open the create modal
  24. {% include howto_step.html - summary="Configure the new Automated Rule" - image-name="4.1.0/create-an-automated-rule-2.png" + summary="Configure the new Automated Rule in the create modal" + image-name="4.2.0/create-an-automated-rule-2.png" text="

    Name: Enter a name for the new rule. The form will alert you if the name @@ -138,11 +138,11 @@ jfrEventTypeIds(target).exists(t, t.startsWith('myorg.myapp.'))

  25. {% include howto_step.html summary="Check your Match Expression" - image-name="4.1.0/create-an-automated-rule-3.png" + image-name="4.2.0/create-an-automated-rule-3.png" caption="You can select a target JVM to view its properties and use them to build your Match Expression." text="

    - When you enter a Match Expression in the Match Expression field, the Match Expression Visualizer will highlight which targets are matched. + When you enter a Match Expression in the Match Expression field, the Match Expression Visualizer in the create modal will highlight which targets are matched.

    " %} @@ -150,7 +150,7 @@ jfrEventTypeIds(target).exists(t, t.startsWith('myorg.myapp.'))
  26. {% include howto_step.html summary="(Optional) Adjust Rule Parameters" - image-name="4.1.0/create-an-automated-rule-4.png" + image-name="4.2.0/create-an-automated-rule-4.png" caption=" Optionally set the Recording Options and Rule Parameters." text=" @@ -178,12 +178,12 @@ jfrEventTypeIds(target).exists(t, t.startsWith('myorg.myapp.'))
  27. - Click the Create Button + Click Create in the modal
  28. {% include howto_step.html summary="Observe the new Rule in the Automated Rules Table" - image-name="4.1.0/create-an-automated-rule-5.png" + image-name="4.2.0/create-an-automated-rule-5.png" caption=" The new rule will appear in the Automated Rules table." %} @@ -194,7 +194,7 @@ jfrEventTypeIds(target).exists(t, t.startsWith('myorg.myapp.'))
  29. {% include howto_step.html summary="Observe the automatically generated Recording in the Active Recordings Table" - image-name="4.1.0/create-an-automated-rule-6.png" + image-name="4.2.0/create-an-automated-rule-6.png" caption=" Switch to the Recordings tab and view the new Recording in the Active Recordings table." @@ -276,4 +276,3 @@ spec: ``` Once the **Custom Resource** has been created, the rule will be pre-loaded into **Cryostat** and be available from startup without any further configuration needed. - diff --git a/guides/_subsections/download-an-active-or-archived-recording.md b/guides/_subsections/download-an-active-or-archived-recording.md index 633178e0..e44d928b 100644 --- a/guides/_subsections/download-an-active-or-archived-recording.md +++ b/guides/_subsections/download-an-active-or-archived-recording.md @@ -27,7 +27,7 @@ or [`jfr`](https://dev.java/learn/jvm/jfr/tools/) for the heavy lifting on your
  30. {% include howto_step.html summary="Download the Recording" - image-name="4.1.0/download-an-active-or-archived-recording-1.png" + image-name="4.2.0/download-an-active-or-archived-recording-1.png" caption=" Click the action overflow \"︙\" three-dot menu on the right side of the recording entry in the table, then click Download Recording. @@ -37,7 +37,7 @@ or [`jfr`](https://dev.java/learn/jvm/jfr/tools/) for the heavy lifting on your
  31. {% include howto_step.html summary="Choose what to do with the Recording File" - image-name="4.1.0/download-an-active-or-archived-recording-2.png" + image-name="4.2.0/download-an-active-or-archived-recording-2.png" caption=" Your browser will present you with its standard file-save dialog for both the Archived Recording, and a .metadata.json file containing any diff --git a/guides/_subsections/download-an-automated-rule.md b/guides/_subsections/download-an-automated-rule.md index 41a099af..f4588b6a 100644 --- a/guides/_subsections/download-an-automated-rule.md +++ b/guides/_subsections/download-an-automated-rule.md @@ -6,12 +6,12 @@
    1. {% include howto_step.html - summary="Open Action Menu for a selected Rule" - image-name="4.1.0/download-an-automated-rule-1.png" + summary="Open the actions menu for a rule" + image-name="4.2.0/download-an-automated-rule-1.png" caption="Click the action overflow \"︙\" three-dot menu on the right side of selected rule entry in the table." %}
    2. - Click Download Button to Download. + Click Download
    diff --git a/guides/_subsections/download-edit-and-upload-a-customized-event-template.md b/guides/_subsections/download-edit-and-upload-a-customized-event-template.md index 1c523e05..67a06338 100644 --- a/guides/_subsections/download-edit-and-upload-a-customized-event-template.md +++ b/guides/_subsections/download-edit-and-upload-a-customized-event-template.md @@ -55,14 +55,14 @@ delete **Custom Event Templates**. necessary to add the Target's certificate to Cryostat's trust store. Go to Add a Trusted Certificate and return to this section after completing that guide. - - + +

    {% endcapture %} {% include howto_step.html summary="Navigate to Flight Recorder/Capture/Events" - image-name="4.1.0/navigate-to-events-1.png" + image-name="4.2.0/navigate-to-events-1.png" caption=" Supply JMX credentials to authenticate to the target, if necessary. If the target is not configured with JMX authentication then the @@ -74,7 +74,7 @@ delete **Custom Event Templates**.
  32. {% include howto_step.html summary="Download the Template" - image-name="4.1.0/download-edit-and-upload-a-customized-event-template-1.png" + image-name="4.2.0/download-edit-and-upload-a-customized-event-template-1.png" caption=" Click the action overflow \"︙\" three-dot menu on the right side of the template entry in the table, then click Download. Rename this file to custom-template.xml. @@ -92,7 +92,7 @@ delete **Custom Event Templates**. {% endcapture %} {% include howto_step.html summary="Edit the Template" - image-name="4.1.0/download-edit-and-upload-a-customized-event-template-2.png" + image-name="4.2.0/download-edit-and-upload-a-customized-event-template-2.png" caption=edit-template-additional-content text=" Edit the Template definition to suit your requirements. When you are @@ -110,7 +110,7 @@ delete **Custom Event Templates**.
  33. {% include howto_step.html summary="Open the Template Upload Dialog" - image-name="4.1.0/download-edit-and-upload-a-customized-event-template-3.png" + image-name="4.2.0/download-edit-and-upload-a-customized-event-template-3.png" caption=" Back on the Events Templates tab, click the Upload Icon in the toolbar. A dialog will appear. @@ -120,7 +120,7 @@ delete **Custom Event Templates**.
  34. {% include howto_step.html summary="Upload the Template" - image-name="4.1.0/download-edit-and-upload-a-customized-event-template-4.png" + image-name="4.2.0/download-edit-and-upload-a-customized-event-template-4.png" caption=" Click the Browse button. Your browser will present its native file chooser dialog to select the file to upload. Browse and @@ -133,7 +133,7 @@ delete **Custom Event Templates**.
  35. {% include howto_step.html summary="Observe the new Template" - image-name="4.1.0/download-edit-and-upload-a-customized-event-template-5.png" + image-name="4.2.0/download-edit-and-upload-a-customized-event-template-5.png" caption=" Once the Template has been uploaded you will be returned to the Events View, and your template will be present in the diff --git a/guides/_subsections/edit-template-with-jmc.md b/guides/_subsections/edit-template-with-jmc.md index 39e99176..05dae517 100644 --- a/guides/_subsections/edit-template-with-jmc.md +++ b/guides/_subsections/edit-template-with-jmc.md @@ -19,7 +19,7 @@ validation or any hinting for event types and options. {% endcapture %} {% include howto_step.html summary="Acquire an Event Template" - image-name="4.1.0/edit-template-with-jmc-1.png" + image-name="4.2.0/edit-template-with-jmc-1.png" caption=" Ensure that you have an event template definition .jfc file somewhere on your local workstation, with read/write permissions. @@ -30,21 +30,21 @@ validation or any hinting for event types and options.
  36. {% include howto_step.html summary="Launch JDK Mission Control" - image-name="4.1.0/edit-template-with-jmc-2.png" + image-name="4.2.0/edit-template-with-jmc-2.png" caption="The main JMC window after launch" %}
  37. {% include howto_step.html summary="Open the Template Manager" - image-name="4.1.0/edit-template-with-jmc-3.png" + image-name="4.2.0/edit-template-with-jmc-3.png" caption="Select Window > Flight Recording Template Manager" %}
  38. {% include howto_step.html summary="Import the Base Template" - image-name="4.1.0/edit-template-with-jmc-4.png" + image-name="4.2.0/edit-template-with-jmc-4.png" caption=" Click Import Files..., then browse to and select the Template from Step 1. @@ -54,7 +54,7 @@ validation or any hinting for event types and options.
  39. {% include howto_step.html summary="Edit the Template" - image-name="4.1.0/edit-template-with-jmc-5.png" + image-name="4.2.0/edit-template-with-jmc-5.png" caption=" Select the imported Template, then click Edit and make your desired changes. Before making changes you may also click @@ -75,7 +75,7 @@ validation or any hinting for event types and options. {% endcapture %} {% include howto_step.html summary="Export the Template" - image-name="4.1.0/edit-template-with-jmc-6.png" + image-name="4.2.0/edit-template-with-jmc-6.png" caption=" Click Export File... to save the event template to a .jfc file on your local workstation. diff --git a/guides/_subsections/getting-help.md b/guides/_subsections/getting-help.md index eaa3b819..e96349c8 100644 --- a/guides/_subsections/getting-help.md +++ b/guides/_subsections/getting-help.md @@ -10,7 +10,7 @@ If you clear your browser's local storage, use a private browsing window, or use {% include howto_step.html summary="Welcome Tour" - image-name="4.1.0/welcome-tour.png" + image-name="4.2.0/welcome-tour.png" caption="Click through the Welcome Tour to learn how to use Cryostat." text="The Welcome Tour provides an introduction to Cryostat's layout and indicates where further tutorials and help can be found." %} @@ -21,7 +21,7 @@ to begin the guided walkthrough of the **Cryostat Web** application. {% include howto_step.html summary="Tour Begins" - image-name="4.1.0/guided-tour.png" + image-name="4.2.0/guided-tour.png" caption="Click Next through the Welcome Tour to learn how to use **Cryostat**." text="Continue through the tour to learn how the UI is organized and where you can find additional help." %} @@ -35,7 +35,7 @@ application masthead, then click Guided tour in the dropdown menu that ap {% include howto_step.html summary="Open Help Menu" - image-name="4.1.0/masthead-help.png" + image-name="4.2.0/masthead-help.png" caption="The ? Help menu on the application masthead contains additional resources." text="Click Guided tour to relaunch the same tour." %} @@ -47,14 +47,14 @@ and will directly guide you through the UI as you complete them by operating on {% include howto_step.html summary="Open Help Menu" - image-name="4.1.0/masthead-help.png" + image-name="4.2.0/masthead-help.png" caption="The ? Help menu on the application masthead contains additional resources." text="Click Quick Starts to view the tutorial catalog." %} {% include howto_step.html summary="View the Quick Start Catalog" - image-name="4.1.0/quick-start-catalog.png" + image-name="4.2.0/quick-start-catalog.png" caption="The Quick Start catalog contains a series of tutorials you can follow to learn how to accomplish specific tasks." text="Select and complete the tutorials which interest you. You can revisit this catalog at any time and re-do tutorials as many times as you like." %} diff --git a/guides/_subsections/navigate-the-dashboard.md b/guides/_subsections/navigate-the-dashboard.md index b5da224a..e2da58ad 100644 --- a/guides/_subsections/navigate-the-dashboard.md +++ b/guides/_subsections/navigate-the-dashboard.md @@ -14,7 +14,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I
    1. {% capture target-jvm-details-text %} - The Target JVM Details card displays information about the target JVM application that is currently selected. There are two tabs that display different information: + The Target JVM Details card displays information about the target JVM application that is currently selected. There are three tabs that display different information:
      • Details Tab - Displays information about the target JVM application, including: @@ -48,11 +48,14 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I
    2. +
    3. + Lineage Tab - Displays an embedded Topology graph view isolating the target JVM application, the Discovery Node it's attached to, that Node's parent Node, up to the Realm level. +
    4. {% endcapture %} {% include howto_step.html summary="Add the Target JVM Details Card" - image-name="4.1.0/dashboard/targetjvmdetails-preview.png" + image-name="4.2.0/dashboard/targetjvmdetails-preview.png" caption=" Click on the Target JVM Details card for a preview. " @@ -65,17 +68,23 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I There are no extra steps in the creation wizard for this card. Click Finish to add the card to your dashboard.
      - - Details tab + + Details tab
      Details Tab
      - - Resources tab + + Resources tab
      Resources Tab
      +
      + + Lineage tab + +
      Lineage Tab
      +
      @@ -91,16 +100,16 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I

      Gallery view

      - - Gallery view + + Gallery view

      The Gallery view of the Automated Analysis Card displays a Result, a report summary, for each Rule that was triggered in the selected Recording. In this view, each Rule is listed in categories based on the event type. For example, the Thrown Errors and the Thrown Exceptions Rules are part of the exceptions category, as seen in the figure above. By clicking on each Rule, you can view more details about the Rule and the Result that was generated.

      - - Automated Analysis Result + + Automated Analysis Result
      The Discouraged Management Agent Settings Rule result with a severity score of 25.0. @@ -126,8 +135,8 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I

      List View

      - - List view + + List view

      @@ -148,7 +157,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Add the Automated Analysis Card" - image-name="4.1.0/dashboard/automatedanalysis-preview.png" + image-name="4.2.0/dashboard/automatedanalysis-preview.png" caption=" Click on the Automated Analysis card for a preview. " @@ -159,8 +168,8 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I

      Perform Analysis

      - - Perform analysis + + Perform analysis

      @@ -168,7 +177,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I
    5. {% include howto_step.html summary="Finish Card Creation" - image-name="4.1.0/dashboard/automatedanalysis-createrecording.png" + image-name="4.2.0/dashboard/automatedanalysis-createrecording.png" caption="The card will be added to the dashboard with an empty state. The Create a Recording call to action will guide you through recording creation with suggested default settings. Return to the Dashboard once a recording has been started." text=automated-analysis-perform-text %} @@ -176,7 +185,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I
    6. {% include howto_step.html summary="View results" - image-name="4.1.0/dashboard/automatedanalysis-success.png" + image-name="4.2.0/dashboard/automatedanalysis-success.png" caption="The Automated Analysis card displayed with a successful report." text="After clicking Create Recording, the card should be populated with report data containing the Results of the Automated Analysis report." %} @@ -203,7 +212,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Add the MBean Metrics Chart Card" - image-name="4.1.0/dashboard/mbeanmetrics-preview.png" + image-name="4.2.0/dashboard/mbeanmetrics-preview.png" caption="Click on the MBean Metrics Chart card for a preview." text=mbean-metrics-chart-text %} @@ -219,7 +228,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Configure the MBean Metrics Chart Card" - image-name="4.1.0/dashboard/mbeanmetrics-configuration.png" + image-name="4.2.0/dashboard/mbeanmetrics-configuration.png" caption="Click Next to provide card configuration." text=configure-mbean-metrics-chart %} @@ -232,7 +241,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Finish Card Creation" - image-name="4.1.0/dashboard/mbeanmetrics.png" + image-name="4.2.0/dashboard/mbeanmetrics.png" caption="The MBean Metrics Chart card displayed with the Process CPU Load metric." text=mbean-metrics-chart-finish %} @@ -262,7 +271,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Add the JFR Metrics Chart Card" - image-name="4.1.0/dashboard/jfrmetrics-preview.png" + image-name="4.2.0/dashboard/jfrmetrics-preview.png" caption="Click on the JFR Metrics Chart card. No preview is available." text=jfr-metrics-chart-text %} @@ -278,7 +287,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Configure the JFR Metrics Chart Card" - image-name="4.1.0/dashboard/jfrmetrics-configuration.png" + image-name="4.2.0/dashboard/jfrmetrics-configuration.png" caption="Click Next to provide card configuration." text=jfr-mbean-metrics-chart %} @@ -291,7 +300,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Finish Card Creation" - image-name="4.1.0/dashboard/jfrmetrics-no-source.png" + image-name="4.2.0/dashboard/jfrmetrics-no-source.png" caption="The JFR Metrics Chart card created with no source recording." text=jfr-metrics-chart-created %} @@ -304,7 +313,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Start source Flight Recording" - image-name="4.1.0/dashboard/jfrmetrics.png" + image-name="4.2.0/dashboard/jfrmetrics.png" caption="The JFR Metrics Chart card displayed with the Memory Usage metric." text=jfr-metrics-chart-finish %} @@ -330,7 +339,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Add the Diagnostics Card" - image-name="4.1.0/dashboard/diagnostics-preview.png" + image-name="4.2.0/dashboard/diagnostics-preview.png" caption="Click on the Diagnostics card. No preview is available." text=diagnostics-card-text %} @@ -343,7 +352,7 @@ The *Dashboard* is the first view you will see when you log into **Cryostat**. I {% endcapture %} {% include howto_step.html summary="Finish Card Creation" - image-name="4.1.0/dashboard/diagnostics.png" + image-name="4.2.0/dashboard/diagnostics.png" caption="The Diagnostics card." text=diagnostics-card-created %} @@ -358,7 +367,7 @@ The Dashboard is highly customizable and can be configured to display the
    7. {% include howto_step.html summary="Add a Card to the Dashboard" - image-name="4.1.0/dashboard/targetjvmdetails-preview.png" + image-name="4.2.0/dashboard/targetjvmdetails-preview.png" caption="Open the card catalog by clicking the Catalog icon on the Dashboard toolbar." text="Let's add the Target JVM Details card." %} @@ -366,14 +375,14 @@ The Dashboard is highly customizable and can be configured to display the
    8. {% include howto_step.html summary="Resize the Card" - image-name="4.1.0/dashboard/dashboard-resize.png" + image-name="4.2.0/dashboard/dashboard-resize.png" caption="Click and drag the right edge of the card to resize it." %}
    9. {% include howto_step.html summary="Add another Card to the Dashboard" - image-name="4.1.0/dashboard/mbeanmetrics-preview.png" + image-name="4.2.0/dashboard/mbeanmetrics-preview.png" caption="Open the card catalog by clicking the Catalog icon on the Dashboard toolbar." text="Let's add the MBean Metrics Chart card this time." %} @@ -381,7 +390,7 @@ The Dashboard is highly customizable and can be configured to display the
    10. {% include howto_step.html summary="Rearrange Cards" - image-name="4.1.0/dashboard/dashboard-rearrange.png" + image-name="4.2.0/dashboard/dashboard-rearrange.png" caption="Click and drag the Target JVM Details card's header on top or to the right of the MBeans Metrics Chart card to swap their positions." %}
    11. @@ -402,15 +411,15 @@ The Dashboard is highly customizable and can be configured to display the

      - - {{ Removed card }} + + {{ Removed card }}
      Click Remove to remove the card.
      {% endcapture %} {% include howto_step.html summary="Remove Cards" - image-name="4.1.0/dashboard/dashboard-cardkebab.png" + image-name="4.2.0/dashboard/dashboard-cardkebab.png" caption="Click the Kebab icon on the card header to open the card actions menu." text=remove-card-text %} @@ -432,14 +441,14 @@ By default, the `Default` layout is created for you. This layout contains the ca
    12. {% include howto_step.html summary="Click New Layout" - image-name="4.1.0/dashboard/dashboard-blanklayout.png" + image-name="4.2.0/dashboard/dashboard-blanklayout.png" text="Clicking New Layout will create a new blank layout and switch the dashboard view to the new layout. The layout should be called something like Custom1." %}
    13. {% include howto_step.html summary="(Optional) Rename Layouts" - image-name="4.1.0/dashboard/dashboard-renamelayout.png" + image-name="4.2.0/dashboard/dashboard-renamelayout.png" caption="Click the Pencil button to rename the currently selected layout." text="You are able to rename layouts by clicking the Pencil button next to the layout selector. This will rename the currently selected layout. You can also rename layouts within the layout selector dropdown itself." %} @@ -447,7 +456,7 @@ By default, the `Default` layout is created for you. This layout contains the ca
    14. {% include howto_step.html summary="(Optional) Delete Layouts" - image-name="4.1.0/dashboard/dashboard-deletelayout.png" + image-name="4.2.0/dashboard/dashboard-deletelayout.png" caption="Click 🗑️ Delete to delete the currently selected layout." text="Deletion is similar to renaming. Click the trash can icon with the text Delete next to the layout selector to delete the currently selected layout. You can also delete layouts within the layout selector dropdown itself." %} @@ -459,7 +468,7 @@ By default, the `Default` layout is created for you. This layout contains the ca
    15. {% include howto_step.html summary="Save a layout as a template" - image-name="4.1.0/dashboard/dashboard-layout-setastemplate.png" + image-name="4.2.0/dashboard/dashboard-layout-setastemplate.png" caption='Click more options "⋮" on the dashboard toolbar, then click Set as template to set the desired layout as a template.' text="The layout template will be saved as a User-submitted template in the template picker." %} @@ -475,7 +484,7 @@ By default, the `Default` layout is created for you. This layout contains the ca
    16. {% include howto_step.html summary="Select Choose Template" - image-name="4.1.0/dashboard/dashboard-layoutselector-options.png" + image-name="4.2.0/dashboard/dashboard-layoutselector-options.png" text="Click the expandable menu on New Layout button and select Choose Template. This will open the template picker." %}
    17. @@ -504,7 +513,7 @@ By default, the `Default` layout is created for you. This layout contains the ca {% endcapture %} {% include howto_step.html summary="Choose a Template" - image-name="4.1.0/dashboard/dashboard-templatepicker.png" + image-name="4.2.0/dashboard/dashboard-templatepicker.png" caption="Clicking a template will open a preview where you can view the template's cards." text=template-picker-guide-text %} @@ -512,14 +521,14 @@ By default, the `Default` layout is created for you. This layout contains the ca
    18. {% include howto_step.html summary="Enter a Name for the New Layout" - image-name="4.1.0/dashboard/dashboard-templatepicker-name.png" + image-name="4.2.0/dashboard/dashboard-templatepicker-name.png" text="A layout name must be entered before the Create button is enabled. The name must be alphanumeric, can only contain underscores, dashes, and periods, and must be 20 characters or less." %}
    19. {% include howto_step.html summary="Click Create" - image-name="4.1.0/dashboard/dashboard-layouttemplate.png" + image-name="4.2.0/dashboard/dashboard-layouttemplate.png" caption="The new layout will be created and the dashboard view will switch to the new layout with the template applied." %}
    20. diff --git a/guides/_subsections/perform-garbage-collection.md b/guides/_subsections/perform-garbage-collection.md index e718a409..ba455b74 100644 --- a/guides/_subsections/perform-garbage-collection.md +++ b/guides/_subsections/perform-garbage-collection.md @@ -9,7 +9,7 @@ {% endcapture %} {% include howto_step.html summary="Navigate to the Diagnostics Page" - image-name="4.1.0/capture-diagnostics-page.png" + image-name="4.2.0/capture-diagnostics-page.png" caption="Click on Diagnostics/Capture on the sidebar." text=perform-garbage-collection-text %} @@ -22,7 +22,7 @@ {% endcapture %} {% include howto_step.html summary="Click the Invoke Garbage Collection button" - image-name="4.1.0/capture-diagnostics-invoke-gc.png" + image-name="4.2.0/capture-diagnostics-invoke-gc.png" text=diagnostics-card-finish %} diff --git a/guides/_subsections/re-upload-a-recording-to-archives.md b/guides/_subsections/re-upload-a-recording-to-archives.md index bdc38f53..9d2fcc39 100644 --- a/guides/_subsections/re-upload-a-recording-to-archives.md +++ b/guides/_subsections/re-upload-a-recording-to-archives.md @@ -9,7 +9,7 @@ previously retrieved Recording in a new **Cryostat** instance.
    21. {% include howto_step.html summary="Navigate to the Flight Recorder/Analyze/Archives View" - image-name="4.1.0/re-upload-a-recording-to-archives-1.png" + image-name="4.2.0/re-upload-a-recording-to-archives-1.png" caption="Select the Uploads tab." text="The entire Archives view contains several tabs related to performing operations on Archived Recordings. See Viewing Archived Recordings. @@ -19,7 +19,7 @@ previously retrieved Recording in a new **Cryostat** instance.
    22. {% include howto_step.html summary="Select the Recording to Upload" - image-name="4.1.0/re-upload-a-recording-to-archives-2.png" + image-name="4.2.0/re-upload-a-recording-to-archives-2.png" caption=" Click the Upload Icon to bring up the upload prompt. Then click Upload and select the .jfr file to upload. Note that the file must follow the Cryostat Archive Recording @@ -30,7 +30,7 @@ previously retrieved Recording in a new **Cryostat** instance.
    23. {% include howto_step.html summary="(Optional) Add Metadata Labels" - image-name="4.1.0/re-upload-a-recording-to-archives-3.png" + image-name="4.2.0/re-upload-a-recording-to-archives-3.png" caption=" Click Show metadata options to add optional Metadata Labels to a Recording. You can either add Labels by clicking the Add Label button, or by uploading @@ -44,7 +44,7 @@ previously retrieved Recording in a new **Cryostat** instance.
    24. {% include howto_step.html summary="Upload the Recording" - image-name="4.1.0/re-upload-a-recording-to-archives-4.png" + image-name="4.2.0/re-upload-a-recording-to-archives-4.png" caption="Click Upload and observe that the Recording is now present in the Uploads tab of the Archives view." %} diff --git a/guides/_subsections/snapshot-a-recording.md b/guides/_subsections/snapshot-a-recording.md index 4d78ec2a..8efbe605 100644 --- a/guides/_subsections/snapshot-a-recording.md +++ b/guides/_subsections/snapshot-a-recording.md @@ -34,7 +34,7 @@ at a given point in time.
    25. {% include howto_step.html summary="Switch to the Snapshot Recording tab" - image-name="4.1.0/snapshot-a-recording-1.png" + image-name="4.2.0/snapshot-a-recording-1.png" caption=" Switch to the Snapshot Recording Tab and Click the Create button. @@ -44,7 +44,7 @@ at a given point in time.
    26. {% include howto_step.html summary="Observe the New snapshot" - image-name="4.1.0/snapshot-a-recording-2.png" + image-name="4.2.0/snapshot-a-recording-2.png" caption=" After clicking the Create button you will be returned to the Active Recordings view and the new snapshot recording will be present diff --git a/guides/_subsections/startstop-a-recording.md b/guides/_subsections/startstop-a-recording.md index 271e1516..728dd04f 100644 --- a/guides/_subsections/startstop-a-recording.md +++ b/guides/_subsections/startstop-a-recording.md @@ -15,7 +15,7 @@ The first and most basic Flight Recorder workflow is to start a `Flight Recordin
    27. {% include howto_step.html summary="Configure the new Recording" - image-name="4.1.0/startstop-a-recording-1.png" + image-name="4.2.0/startstop-a-recording-1.png" text="

      Enter a Name for the new Recording. The form will alert you if the name @@ -49,7 +49,7 @@ The first and most basic Flight Recorder workflow is to start a `Flight Recordin

    28. {% include howto_step.html summary="(Optional) Adjust any Advanced Options for the Recording" - image-name="4.1.0/startstop-a-recording-2.png" + image-name="4.2.0/startstop-a-recording-2.png" text="

      In many cases, the Advanced Options can be left with their @@ -108,7 +108,7 @@ The first and most basic Flight Recorder workflow is to start a `Flight Recordin {% endcapture %} {% include howto_step.html summary="Stop the Recording" - image-name="4.1.0/startstop-a-recording-3.png" + image-name="4.2.0/startstop-a-recording-3.png" text=stop-the-recording-additional-content %}

    29. diff --git a/guides/_subsections/store-credentials.md b/guides/_subsections/store-credentials.md index d1def50c..c506a159 100644 --- a/guides/_subsections/store-credentials.md +++ b/guides/_subsections/store-credentials.md @@ -6,10 +6,10 @@ before it can access the **JDK** `Flight Recordings` on your `target` **JVMs**.
      1. {% include howto_step.html - summary="Navigate to the Console/Security view" - image-name="4.1.0/navigate-to-security.png" + summary="Navigate to the Security/Credentials view" + image-name="4.2.0/navigate-to-security.png" text=" - First, navigate to the Console/Security view. The Store Credentials table + First, navigate to the Security/Credentials view. The Store Credentials table lists all credentials in Cryostat's Keyring. Click Add to define a new credential. " @@ -18,7 +18,7 @@ before it can access the **JDK** `Flight Recordings` on your `target` **JVMs**.
      2. {% include howto_step.html summary="Enter your Credentials" - image-name="4.1.0/store-credentials-1.png" + image-name="4.2.0/store-credentials-1.png" text=" A modal will appear. You can select a target JVM to view its properties. @@ -35,7 +35,7 @@ before it can access the **JDK** `Flight Recordings` on your `target` **JVMs**.
      3. {% include howto_step.html summary="Test your Credentials" - image-name="4.1.0/store-credentials-3.png" + image-name="4.2.0/store-credentials-3.png" text=" Navigate to the Test tab to use the Credential Test table to check if the entered credential is valid for the matched targets. @@ -66,7 +66,7 @@ before it can access the **JDK** `Flight Recordings` on your `target` **JVMs**. (Alternative to Steps 1 and 2) Store Credentials when Connecting to a Target JVM " - image-name="4.1.0/navigate-to-recordings-1.png" + image-name="4.2.0/navigate-to-recordings-1.png" text=" Alternatively, credentials may also be stored if you navigate to either the Flight Recorder/Capture/Recordings view or the Flight Recorder/Capture/Events view and select a target @@ -80,7 +80,7 @@ before it can access the **JDK** `Flight Recordings` on your `target` **JVMs**.
      4. {% include howto_step.html summary="View your Stored Credentials" - image-name="4.1.0/store-credentials-2.png" + image-name="4.2.0/store-credentials-2.png" text=" The Store Credentials table will update with a row for each of the credentials you have stored in the Keyring. The matchExpression is visible along with a count of the number of known target applications that these credentials will apply to. You can expand the row to display a list of those matched target applications. For security reasons it is not possible to view the stored username and password associated with a credential definition in the Keyring. " diff --git a/guides/_subsections/upload-an-automated-rule.md b/guides/_subsections/upload-an-automated-rule.md index dfd1eeb2..9a90694c 100644 --- a/guides/_subsections/upload-an-automated-rule.md +++ b/guides/_subsections/upload-an-automated-rule.md @@ -23,7 +23,7 @@ Below is an example of a rule file content:
      5. {% include howto_step.html summary="Navigate to the Flight Recorder/Capture/Automated Rules Tab" - image-name="4.1.0/create-an-automated-rule-1.png" + image-name="4.2.0/create-an-automated-rule-1.png" %}
      6. @@ -32,23 +32,23 @@ Below is an example of a rule file content:
      7. {% include howto_step.html summary="Open Automated Rules upload modal" - image-name="4.1.0/upload-an-automated-rule-1.png" + image-name="4.2.0/upload-an-automated-rule-1.png" %}
      8. {% include howto_step.html - summary="Attach a Rule File by Dragging & Dropping or clicking Browse...." - image-name="4.1.0/upload-an-automated-rule-2.png" + summary="Attach a rule file by dragging and dropping it or clicking Upload" + image-name="4.2.0/upload-an-automated-rule-2.png" caption="Select a rule file to upload. The file should not include the "id" field as this will be assigned by the application database." %}
      9. - Click Submit Button to Upload. + Click Submit to upload the rule
      10. {% include howto_step.html summary="Observe the new rule in the Automated Rules table" - image-name="4.1.0/create-an-automated-rule-5.png" + image-name="4.2.0/create-an-automated-rule-5.png" caption=" The new rule will appear in the Automated Rules table." %} diff --git a/guides/_subsections/use-topology-view.md b/guides/_subsections/use-topology-view.md index 631eda74..c067fa2b 100644 --- a/guides/_subsections/use-topology-view.md +++ b/guides/_subsections/use-topology-view.md @@ -33,13 +33,13 @@ The *Topology View* provides a visual presentation of all the discovered **JVM** {% include howto_step.html summary="View JVM Applications with Graph View" - image-name="4.1.0/topology-1.png" + image-name="4.2.0/topology-1.png" caption="View JVM applications with Topology Graph view." text=topology-graphview-guide-text %} {% include howto_step.html summary="View JVM Applications with List View" - image-name="4.1.0/topology-2.png" + image-name="4.2.0/topology-2.png" caption="View JVM applications with Topology List view." text=topology-listview-guide-text %} @@ -72,13 +72,13 @@ The *Topology View* provides a visual presentation of all the discovered **JVM** {% include howto_step.html summary="View JVM Details" - image-name="4.1.0/topology-3.png" + image-name="4.2.0/topology-3.png" caption="View target JVM’s details with drawer panel." text=sidebar-detail-guide-text %} {% include howto_step.html summary="View JVM's Associated Resources" - image-name="4.1.0/topology-4.png" + image-name="4.2.0/topology-4.png" caption="View JVM's associated resources with drawer panel." text=sidebar-resource-guide-text %} @@ -100,13 +100,13 @@ The *Topology View* provides a visual presentation of all the discovered **JVM** {% include howto_step.html summary="Perform Actions for a Single JVM" - image-name="4.1.0/topology-5.png" + image-name="4.2.0/topology-5.png" caption="Perform actions on an individual JVM." text=single-action-guide-text %} {% include howto_step.html summary="Perform Actions for a Group of JVMs" - image-name="4.1.0/topology-6.png" + image-name="4.2.0/topology-6.png" caption="Perform actions on a group of JVMs." text=bulk-action-guide-text %} diff --git a/guides/_subsections/using-smart-triggers.md b/guides/_subsections/using-smart-triggers.md index 878b71a4..4abc8c29 100644 --- a/guides/_subsections/using-smart-triggers.md +++ b/guides/_subsections/using-smart-triggers.md @@ -71,6 +71,25 @@ This example uses the same custom trigger criteria as the preceding examples.

      11. +
      12. +
        + Using the Cryostat UI + {% include howto_step.html + summary="Navigate to the Capture/Triggers view" + image-name="4.2.0/create-a-smart-trigger-1.png" + caption=" + After navigating to the Capture/Triggers page and clicking the Create button, a form will be displayed allowing for the creation of smart triggers. Simply select the MBean Attribute for the trigger and set the condition, then select a target duration if desired and select an event template to be used. Custom event templates may be used as well as the built in templates. For more information on the available MBean Attributes, see Supported MBean Attributes. + " + %} + {% include howto_step.html + summary="View active Smart Triggers" + image-name="4.2.0/create-a-smart-trigger-2.png" + caption=" + Once the Smart Trigger has been created it will be displayed in the table, showing the conditions that must be met as well as the Recording Template used for starting a Recording once conditions are met. From this table, the user can filter by any of the displayed attributes (ID, duration, condition, template), for instance entering Profiling will display any active Smart Triggers using the Profiling template. Triggers may also be deleted, stopping them from activating. + " + %} +
        +
      #### [General Syntax Rules for Custom Triggers](#general-syntax-rules-for-custom-triggers) @@ -105,3 +124,34 @@ Consider the following syntax guidelines for defining custom triggers:
    + +#### [Supported MBean Attributes](#supported-mbean-attributes) + +The following MBean Attributes are supported for use with Smart Triggers: + +**Operating System Metrics** +- DaemonThreadCount +- ThreadCount +- AvailableProcessors +- SystemCpuLoad +- SystemLoadAverage +- ProcessCpuLoad +- TotalPhyiscalMemorySize +- FreePhysicalMemorySize +- TotalSwapSpaceSize + +**Thread Metrics** +- ThreadCount +- DaemonThreadCount + +**Runtime Metrics** +- StartTime +- Uptime + +**Memory Metrics** +- HeapMemoryUsage +- NonHeapMemoryUsage +- HeapMemoryUsagePercent + + + diff --git a/guides/_subsections/view-archived-recordings.md b/guides/_subsections/view-archived-recordings.md index aecb825f..86e8ea1c 100644 --- a/guides/_subsections/view-archived-recordings.md +++ b/guides/_subsections/view-archived-recordings.md @@ -22,7 +22,7 @@ The All-Targets view gathers all of Cryostat's discovered ta {% endcapture %} {% include howto_step.html summary="Navigate to the All-Targets Archived Recordings view" - image-name="4.1.0/navigate-to-all-targets.png" + image-name="4.2.0/navigate-to-all-targets.png" caption="Click on the Flight Recorder/Analyze/Archives route on the sidebar, and the first tab should automatically be selected as the Targets Archives view." text=navigate-to-all-targets-include-text %} @@ -33,7 +33,7 @@ The All-Targets view gathers all of Cryostat's discovered ta {% endcapture %} {% include howto_step.html summary="Select a Source Target Application" - image-name="4.1.0/view-archives-recordings-1.png" + image-name="4.2.0/view-archives-recordings-1.png" caption="Clicking the dropdown arrow next to a target name will list any Archived Recordings originating from that source target." text=click-on-source-target-include-text %} @@ -57,7 +57,7 @@ This view is used to save any lost `Archived Recordings` in case any `target` ** {% endcapture %} {% include howto_step.html summary="Navigate to the All-Archives Archived Recordings View" - image-name="4.1.0/navigate-to-all-archives.png" + image-name="4.2.0/navigate-to-all-archives.png" caption="Click on the Flight Recorder/Analyze/Archives view on the sidebar, and select the second tab titled All Archives." text=navigate-to-all-archives-include-text %} @@ -71,7 +71,7 @@ This view is used to save any lost `Archived Recordings` in case any `target` ** {% endcapture %} {% include howto_step.html summary="Select an Archives directory" - image-name="4.1.0/view-archives-recordings-2.png" + image-name="4.2.0/view-archives-recordings-2.png" caption="Clicking the dropdown arrow next to a directory name will list any Archived Recordings within that directory in the Cryostat storage. Again, we can interact with any Archived Recordings in a similar fashion as before." text=click-on-directory-include-text %} diff --git a/guides/_subsections/view-in-grafana.md b/guides/_subsections/view-in-grafana.md index df0a6ce3..55da077e 100644 --- a/guides/_subsections/view-in-grafana.md +++ b/guides/_subsections/view-in-grafana.md @@ -30,7 +30,7 @@ which you use to log in to Cryostat.
  40. {% include howto_step.html summary="Select View in Grafana..." - image-name="4.1.0/view-in-grafana-1.png" + image-name="4.2.0/view-in-grafana-1.png" caption=" Select View in Grafana... from the Recording's overflow menu. @@ -40,7 +40,7 @@ which you use to log in to Cryostat.
  41. {% include howto_step.html summary="View and Interact With Data From Your Recording" - image-name="4.1.0/view-in-grafana-2.png" + image-name="4.2.0/view-in-grafana-2.png" caption=" Observe the plotted time series data from curated metrics in your Recording. Select time ranges to zoom into the data. diff --git a/guides/_subsections/view-jfr-event-types.md b/guides/_subsections/view-jfr-event-types.md index 9961fd0a..ac7f5a96 100644 --- a/guides/_subsections/view-jfr-event-types.md +++ b/guides/_subsections/view-jfr-event-types.md @@ -21,14 +21,14 @@ so you can see what kind of data may be captured by **Flight Recordings**. necessary to add the Target's certificate to Cryostat's trust store. Go to Add a Trusted Certificate and return to this section after completing that guide. - - + +

    {% endcapture %} {% include howto_step.html summary="Navigate to Flight Recorder/Capture/Events" - image-name="4.1.0/navigate-to-events-1.png" + image-name="4.2.0/navigate-to-events-1.png" caption=" Supply JMX credentials to authenticate to the target, if necessary. If the target is not configured with JMX authentication then the @@ -40,7 +40,7 @@ so you can see what kind of data may be captured by **Flight Recordings**.
  42. {% include howto_step.html summary="Navigate to Event Types" - image-name="4.1.0/navigate-to-event-types-1.png" + image-name="4.2.0/navigate-to-event-types-1.png" caption=" Select the Event Types tab to view a table listing of all the JDK Flight Recorder Event Types registered in the Target JVM. diff --git a/guides/index.md b/guides/index.md index 8a1e7db8..7ebad295 100644 --- a/guides/index.md +++ b/guides/index.md @@ -63,5 +63,7 @@ common actions and workflows of interest and why they are useful. {% include_relative _subsections/capture-a-heap-dump.md %} +{% include_relative _subsections/analyze-a-thread-dump.md %} + [comment]: # ## [Analyze Recordings Online](#analyze-recordings-online) [comment]: # TODO diff --git a/images/4.2.0/add-a-trusted-certificate-upload.png b/images/4.2.0/add-a-trusted-certificate-upload.png new file mode 100644 index 00000000..af99f861 Binary files /dev/null and b/images/4.2.0/add-a-trusted-certificate-upload.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-1.png b/images/4.2.0/add-and-edit-recording-metadata-labels-1.png new file mode 100644 index 00000000..ce06e75c Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-1.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-2.png b/images/4.2.0/add-and-edit-recording-metadata-labels-2.png new file mode 100644 index 00000000..76d600ee Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-2.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-3.png b/images/4.2.0/add-and-edit-recording-metadata-labels-3.png new file mode 100644 index 00000000..20ae07ed Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-3.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-4.png b/images/4.2.0/add-and-edit-recording-metadata-labels-4.png new file mode 100644 index 00000000..658a79c2 Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-4.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-5.png b/images/4.2.0/add-and-edit-recording-metadata-labels-5.png new file mode 100644 index 00000000..bba30414 Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-5.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-6.png b/images/4.2.0/add-and-edit-recording-metadata-labels-6.png new file mode 100644 index 00000000..9e375a19 Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-6.png differ diff --git a/images/4.2.0/add-and-edit-recording-metadata-labels-7.png b/images/4.2.0/add-and-edit-recording-metadata-labels-7.png new file mode 100644 index 00000000..dc229309 Binary files /dev/null and b/images/4.2.0/add-and-edit-recording-metadata-labels-7.png differ diff --git a/images/4.2.0/advanced-setting.png b/images/4.2.0/advanced-setting.png new file mode 100644 index 00000000..0b272a20 Binary files /dev/null and b/images/4.2.0/advanced-setting.png differ diff --git a/images/4.2.0/agent-autoconfiguration-wizard-1.png b/images/4.2.0/agent-autoconfiguration-wizard-1.png new file mode 100644 index 00000000..c955eb53 Binary files /dev/null and b/images/4.2.0/agent-autoconfiguration-wizard-1.png differ diff --git a/images/4.2.0/agent-autoconfiguration-wizard-2.png b/images/4.2.0/agent-autoconfiguration-wizard-2.png new file mode 100644 index 00000000..32783453 Binary files /dev/null and b/images/4.2.0/agent-autoconfiguration-wizard-2.png differ diff --git a/images/4.2.0/analyze-a-thread-dump-1.png b/images/4.2.0/analyze-a-thread-dump-1.png new file mode 100644 index 00000000..c22d8e06 Binary files /dev/null and b/images/4.2.0/analyze-a-thread-dump-1.png differ diff --git a/images/4.2.0/analyze-a-thread-dump-2.png b/images/4.2.0/analyze-a-thread-dump-2.png new file mode 100644 index 00000000..b37d9fda Binary files /dev/null and b/images/4.2.0/analyze-a-thread-dump-2.png differ diff --git a/images/4.2.0/analyze-a-thread-dump-3.png b/images/4.2.0/analyze-a-thread-dump-3.png new file mode 100644 index 00000000..6e0ee40a Binary files /dev/null and b/images/4.2.0/analyze-a-thread-dump-3.png differ diff --git a/images/4.2.0/analyze-a-thread-dump-4.png b/images/4.2.0/analyze-a-thread-dump-4.png new file mode 100644 index 00000000..baa764a9 Binary files /dev/null and b/images/4.2.0/analyze-a-thread-dump-4.png differ diff --git a/images/4.2.0/archive-a-heap-dump.png b/images/4.2.0/archive-a-heap-dump.png new file mode 100644 index 00000000..2c84c754 Binary files /dev/null and b/images/4.2.0/archive-a-heap-dump.png differ diff --git a/images/4.2.0/archive-a-recording-1.png b/images/4.2.0/archive-a-recording-1.png new file mode 100644 index 00000000..8451212d Binary files /dev/null and b/images/4.2.0/archive-a-recording-1.png differ diff --git a/images/4.2.0/archive-a-recording-2.png b/images/4.2.0/archive-a-recording-2.png new file mode 100644 index 00000000..5224b6b1 Binary files /dev/null and b/images/4.2.0/archive-a-recording-2.png differ diff --git a/images/4.2.0/archive-a-thread-dump.png b/images/4.2.0/archive-a-thread-dump.png new file mode 100644 index 00000000..b777ac69 Binary files /dev/null and b/images/4.2.0/archive-a-thread-dump.png differ diff --git a/images/4.2.0/automated-analysis-1.png b/images/4.2.0/automated-analysis-1.png new file mode 100644 index 00000000..5545bf59 Binary files /dev/null and b/images/4.2.0/automated-analysis-1.png differ diff --git a/images/4.2.0/automated-analysis-2.png b/images/4.2.0/automated-analysis-2.png new file mode 100644 index 00000000..86a10ec2 Binary files /dev/null and b/images/4.2.0/automated-analysis-2.png differ diff --git a/images/4.2.0/automated-analysis-3.png b/images/4.2.0/automated-analysis-3.png new file mode 100644 index 00000000..d60906b7 Binary files /dev/null and b/images/4.2.0/automated-analysis-3.png differ diff --git a/images/4.2.0/automated-analysis-4.png b/images/4.2.0/automated-analysis-4.png new file mode 100644 index 00000000..077b099d Binary files /dev/null and b/images/4.2.0/automated-analysis-4.png differ diff --git a/images/4.2.0/capture-diagnostics-invoke-gc.png b/images/4.2.0/capture-diagnostics-invoke-gc.png new file mode 100644 index 00000000..e6804ca5 Binary files /dev/null and b/images/4.2.0/capture-diagnostics-invoke-gc.png differ diff --git a/images/4.2.0/capture-diagnostics-page.png b/images/4.2.0/capture-diagnostics-page.png new file mode 100644 index 00000000..59ee6526 Binary files /dev/null and b/images/4.2.0/capture-diagnostics-page.png differ diff --git a/images/4.2.0/click-create.png b/images/4.2.0/click-create.png new file mode 100644 index 00000000..3836ba21 Binary files /dev/null and b/images/4.2.0/click-create.png differ diff --git a/images/4.2.0/create-a-smart-trigger-1.png b/images/4.2.0/create-a-smart-trigger-1.png new file mode 100644 index 00000000..587be6eb Binary files /dev/null and b/images/4.2.0/create-a-smart-trigger-1.png differ diff --git a/images/4.2.0/create-a-smart-trigger-2.png b/images/4.2.0/create-a-smart-trigger-2.png new file mode 100644 index 00000000..0408f633 Binary files /dev/null and b/images/4.2.0/create-a-smart-trigger-2.png differ diff --git a/images/4.2.0/create-an-automated-rule-1.png b/images/4.2.0/create-an-automated-rule-1.png new file mode 100644 index 00000000..eaa0bdc9 Binary files /dev/null and b/images/4.2.0/create-an-automated-rule-1.png differ diff --git a/images/4.2.0/create-an-automated-rule-2.png b/images/4.2.0/create-an-automated-rule-2.png new file mode 100644 index 00000000..ef61d6c7 Binary files /dev/null and b/images/4.2.0/create-an-automated-rule-2.png differ diff --git a/images/4.2.0/create-an-automated-rule-3.png b/images/4.2.0/create-an-automated-rule-3.png new file mode 100644 index 00000000..79d32a93 Binary files /dev/null and b/images/4.2.0/create-an-automated-rule-3.png differ diff --git a/images/4.2.0/create-an-automated-rule-4.png b/images/4.2.0/create-an-automated-rule-4.png new file mode 100644 index 00000000..570db50d Binary files /dev/null and b/images/4.2.0/create-an-automated-rule-4.png differ diff --git a/images/4.2.0/create-an-automated-rule-5.png b/images/4.2.0/create-an-automated-rule-5.png new file mode 100644 index 00000000..3a65d38e Binary files /dev/null and b/images/4.2.0/create-an-automated-rule-5.png differ diff --git a/images/4.2.0/create-an-automated-rule-6.png b/images/4.2.0/create-an-automated-rule-6.png new file mode 100644 index 00000000..ea3b7583 Binary files /dev/null and b/images/4.2.0/create-an-automated-rule-6.png differ diff --git a/images/4.2.0/credentials-setting.png b/images/4.2.0/credentials-setting.png new file mode 100644 index 00000000..3d7fd3d8 Binary files /dev/null and b/images/4.2.0/credentials-setting.png differ diff --git a/images/4.2.0/cryostat-architecture.dot b/images/4.2.0/cryostat-architecture.dot new file mode 100644 index 00000000..cc4e5350 --- /dev/null +++ b/images/4.2.0/cryostat-architecture.dot @@ -0,0 +1,219 @@ +digraph deployment { + label="OpenShift Operator Deployment"; + newrank="true"; + compound="true"; + + subgraph cluster_0 { + label="OpenShift Cluster" + OperatorCRDs [shape="diamond"]; + + subgraph cluster_namespace_c1 { + label="Namespace C1"; + + subgraph cluster_Cryostat_1 { + label="Cryostat Pod"; + AuthProxy1; + { + Cryostat1 -> JFRDatasource1 [color="red" style="dashed"]; + JFRDatasource1 -> GrafanaDashboard1 [color="red" style="dashed"]; + GrafanaDashboard1 -> AuthProxy1 [color="red" style="dashed"]; + Cryostat1 -> AuthProxy1 [color="red" style="dashed" dir="both"]; + Cryostat1 -> AuthProxy1 [color="blue" style="dashed" dir="both"]; + Cryostat1 -> AgentProxy1 [color="red" style="dashed" dir="both"]; + } + } + + subgraph cluster_Cryostat_Database_1 { + label="Cryostat Database" + Cryostat1 -> CryostatDb1 [color="orange"]; + } + + subgraph cluster_Cryostat_Reports_1 { + label="Cryostat Reports Pod"; + Cryostat1 -> CryostatReports [color="red"]; + } + } + + subgraph cluster_namespace_c2 { + label="Namespace C2"; + + subgraph cluster_Cryostat_2 { + label="Cryostat Pod"; + AuthProxy2; + Cryostat2; + { + Cryostat2 -> JFRDatasource2 [color="red" style="dashed"]; + JFRDatasource2 -> GrafanaDashboard2 [color="red" style="dashed"]; + GrafanaDashboard2 -> AuthProxy2 [color="red" style="dashed"] + Cryostat2 -> AuthProxy2 [color="red" style="dashed" dir="both"]; + Cryostat2 -> AuthProxy2 [color="blue" style="dashed" dir="both"]; + Cryostat2 -> AgentProxy2 [color="red" style="dashed" dir="both"]; + } + } + + subgraph cluster_Cryostat_Database_2 { + label="Cryostat Database" + Cryostat2 -> CryostatDb2 [color="orange"]; + } + + subgraph cluster_Cryostat_Storage_2 { + label="Cryostat Storage" + Cryostat2 -> CryostatStorage2 [color="red"]; + JFRDatasource2 -> CryostatStorage2 [color="red"]; + } + } + + { + rank="same"; + Cryostat2; + } + + subgraph cluster_namespace_c0 { + label="Namespace C0"; + + subgraph cluster_operator { + label="Operator Pod" + OperatorControllers; + } + } + + subgraph cluster_namespace_a { + label="Namespace A"; + subgraph cluster_target1 { + label="Application Pod 1" + JVM1 -> Cryostat1 [color="green"]; + } + } + + subgraph cluster_namespace_b { + label="Namespace B"; + subgraph cluster_target2 { + label="Application Pod 2" + JVM2 -> Cryostat1 [color="green"]; + } + } + + subgraph cluster_namespace_y { + label="Namespace Y"; + subgraph cluster_target3 { + label="Application Pod 3" + subgraph cluster_JVM3 { + label="JVM3"; + style="rounded"; + subgraph JVM3_Agent { + label="JVM3_Agent"; + JVM3_Agent -> AuthProxy2 [color="red" dir="both"]; + } + } + } + } + + subgraph cluster_namespace_z { + label="Namespace Z"; + subgraph cluster_target4 { + label="Application Pod 4" + subgraph cluster_JVM4 { + label="JVM4"; + style="rounded"; + subgraph JVM4_Agent { + label="JVM4_Agent"; + JVM4_Agent -> AgentProxy2 [color="red" dir="both"]; + } + } + } + } + + { + rank="same"; + JVM1; + JVM2; + JVM3_Agent; + JVM4_Agent; + } + + subgraph cluster_console { + label="OpenShift Console"; + + subgraph cluster_console_plugin { + label="Cryostat Console Plugin" + PluginService; + PluginPod1 -> PluginService [color="red"]; + PluginPod1 -> PluginService [color="blue"]; + PluginPod2 -> PluginService [color="red"]; + PluginPod2 -> PluginService [color="blue"]; + + AuthProxy1 -> PluginPod1 [color="red"]; + AuthProxy1 -> PluginPod1 [color="blue"]; + AuthProxy1 -> PluginPod2 [color="red"]; + AuthProxy1 -> PluginPod2 [color="blue"]; + AuthProxy2 -> PluginPod1 [color="red"]; + AuthProxy2 -> PluginPod1 [color="blue"]; + AuthProxy2 -> PluginPod2 [color="red"]; + AuthProxy2 -> PluginPod2 [color="blue"]; + } + + { + ConsoleService -> PluginUI [color="red"]; + ConsoleService -> PluginUI [color="blue"]; + PluginService -> ConsoleService [color="red"]; + PluginService -> ConsoleService [color="blue"]; + } + } + } + + subgraph cluster_outside { + label="Outside"; + + User [shape="circle"]; + { + rank="same"; + WebClient [shape="diamond"]; + } + + OperatorControllers -> OperatorCRDs [color="red" ltail="cluster_operator"]; + OperatorCRDs -> User [color="red" label="OpenShift (oc)"]; + AuthProxy1 -> WebClient [color="red"]; + AuthProxy2 -> WebClient [color="red"]; + AuthProxy1 -> WebClient [color="blue"]; + AuthProxy2 -> WebClient [color="blue"]; + WebClient -> User [color="red" label="Web Browser"]; + PluginUI -> User [color="red"]; + PluginUI -> User [color="blue"]; + Cryostat1 -> CommercialObjectStorage [color="red"]; + JFRDatasource1 -> CommercialObjectStorage [color="red"]; + CryostatReports -> CommercialObjectStorage [color="red"]; + User -> CommercialObjectStorage [color="red"]; + } + + subgraph cluster_legend { + node [shape="plaintext"] + label="Legend" + rank="same" + key [label=< + + + + + + + +
    HTTP
    HTTPS
    WS
    WSS
    JMX+TLS
    JDBC+TLS
    Other
    >] + key2 [label=< + + + + + + + +
     
     
     
     
     
     
     
    >] + key:i1:e -> key2:i1:w [color=red style=dashed] + key:i2:e -> key2:i2:w [color=red] + key:i3:e -> key2:i3:w [color=blue style=dashed] + key:i4:e -> key2:i4:w [color=blue] + key:i5:e -> key2:i5:w [color=green] + key:i6:e -> key2:i6:w [color=orange] + key:i7:e -> key2:i7:w [color=black style=dashed] + } + +} diff --git a/images/4.2.0/cryostat-architecture.dot.svg b/images/4.2.0/cryostat-architecture.dot.svg new file mode 100644 index 00000000..4afb1753 --- /dev/null +++ b/images/4.2.0/cryostat-architecture.dot.svg @@ -0,0 +1,681 @@ + + + + + + +deployment + +OpenShift Operator Deployment + +cluster_0 + +OpenShift Cluster + + +cluster_namespace_c1 + +Namespace C1 + + +cluster_Cryostat_1 + +Cryostat Pod + + +cluster_Cryostat_Database_1 + +Cryostat Database + + +cluster_Cryostat_Reports_1 + +Cryostat Reports Pod + + +cluster_namespace_c2 + +Namespace C2 + + +cluster_Cryostat_2 + +Cryostat Pod + + +cluster_Cryostat_Database_2 + +Cryostat Database + + +cluster_Cryostat_Storage_2 + +Cryostat Storage + + +cluster_namespace_c0 + +Namespace C0 + + +cluster_operator + +Operator Pod + + +cluster_namespace_a + +Namespace A + + +cluster_target1 + +Application Pod 1 + + +cluster_namespace_b + +Namespace B + + +cluster_target2 + +Application Pod 2 + + +cluster_namespace_y + +Namespace Y + + +cluster_target3 + +Application Pod 3 + + +cluster_JVM3 + +JVM3 + + +cluster_namespace_z + +Namespace Z + + +cluster_target4 + +Application Pod 4 + + +cluster_JVM4 + +JVM4 + + +cluster_console + +OpenShift Console + + +cluster_console_plugin + +Cryostat Console Plugin + + +cluster_outside + +Outside + + +cluster_legend + +Legend + + + +OperatorCRDs + +OperatorCRDs + + + +User + +User + + + +OperatorCRDs->User + + +OpenShift (oc) + + + +AuthProxy1 + +AuthProxy1 + + + +PluginPod1 + +PluginPod1 + + + +AuthProxy1->PluginPod1 + + + + + +AuthProxy1->PluginPod1 + + + + + +PluginPod2 + +PluginPod2 + + + +AuthProxy1->PluginPod2 + + + + + +AuthProxy1->PluginPod2 + + + + + +WebClient + +WebClient + + + +AuthProxy1->WebClient + + + + + +AuthProxy1->WebClient + + + + + +Cryostat1 + +Cryostat1 + + + +Cryostat1->AuthProxy1 + + + + + + +Cryostat1->AuthProxy1 + + + + + + +JFRDatasource1 + +JFRDatasource1 + + + +Cryostat1->JFRDatasource1 + + + + + +AgentProxy1 + +AgentProxy1 + + + +Cryostat1->AgentProxy1 + + + + + + +CryostatDb1 + +CryostatDb1 + + + +Cryostat1->CryostatDb1 + + + + + +CryostatReports + +CryostatReports + + + +Cryostat1->CryostatReports + + + + + +CommercialObjectStorage + +CommercialObjectStorage + + + +Cryostat1->CommercialObjectStorage + + + + + +GrafanaDashboard1 + +GrafanaDashboard1 + + + +JFRDatasource1->GrafanaDashboard1 + + + + + +JFRDatasource1->CommercialObjectStorage + + + + + +GrafanaDashboard1->AuthProxy1 + + + + + +CryostatReports->CommercialObjectStorage + + + + + +AuthProxy2 + +AuthProxy2 + + + +AuthProxy2->PluginPod1 + + + + + +AuthProxy2->PluginPod1 + + + + + +AuthProxy2->PluginPod2 + + + + + +AuthProxy2->PluginPod2 + + + + + +AuthProxy2->WebClient + + + + + +AuthProxy2->WebClient + + + + + +Cryostat2 + +Cryostat2 + + + +Cryostat2->AuthProxy2 + + + + + + +Cryostat2->AuthProxy2 + + + + + + +JFRDatasource2 + +JFRDatasource2 + + + +Cryostat2->JFRDatasource2 + + + + + +AgentProxy2 + +AgentProxy2 + + + +Cryostat2->AgentProxy2 + + + + + + +CryostatDb2 + +CryostatDb2 + + + +Cryostat2->CryostatDb2 + + + + + +CryostatStorage2 + +CryostatStorage2 + + + +Cryostat2->CryostatStorage2 + + + + + +GrafanaDashboard2 + +GrafanaDashboard2 + + + +JFRDatasource2->GrafanaDashboard2 + + + + + +JFRDatasource2->CryostatStorage2 + + + + + +GrafanaDashboard2->AuthProxy2 + + + + + +OperatorControllers + +OperatorControllers + + + +OperatorControllers->OperatorCRDs + + + + + +JVM1 + +JVM1 + + + +JVM1->Cryostat1 + + + + + +JVM2 + +JVM2 + + + +JVM2->Cryostat1 + + + + + +JVM3_Agent + +JVM3_Agent + + + +JVM3_Agent->AuthProxy2 + + + + + + +JVM4_Agent + +JVM4_Agent + + + +JVM4_Agent->AgentProxy2 + + + + + + +PluginService + +PluginService + + + +ConsoleService + +ConsoleService + + + +PluginService->ConsoleService + + + + + +PluginService->ConsoleService + + + + + +PluginPod1->PluginService + + + + + +PluginPod1->PluginService + + + + + +PluginPod2->PluginService + + + + + +PluginPod2->PluginService + + + + + +PluginUI + +PluginUI + + + +ConsoleService->PluginUI + + + + + +ConsoleService->PluginUI + + + + + +PluginUI->User + + + + + +PluginUI->User + + + + + +User->CommercialObjectStorage + + + + + +WebClient->User + + +Web Browser + + + +key +HTTP +HTTPS +WS +WSS +JMX+TLS +JDBC+TLS +Other + + + +key2 +  +  +  +  +  +  +  + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + +key:e->key2:w + + + + + diff --git a/images/4.2.0/custom-target-1.png b/images/4.2.0/custom-target-1.png new file mode 100644 index 00000000..122dc5eb Binary files /dev/null and b/images/4.2.0/custom-target-1.png differ diff --git a/images/4.2.0/custom-target-2.png b/images/4.2.0/custom-target-2.png new file mode 100644 index 00000000..35e99858 Binary files /dev/null and b/images/4.2.0/custom-target-2.png differ diff --git a/images/4.2.0/custom-target-3.png b/images/4.2.0/custom-target-3.png new file mode 100644 index 00000000..4a874329 Binary files /dev/null and b/images/4.2.0/custom-target-3.png differ diff --git a/images/4.2.0/custom-target-4.png b/images/4.2.0/custom-target-4.png new file mode 100644 index 00000000..c1228ee1 Binary files /dev/null and b/images/4.2.0/custom-target-4.png differ diff --git a/images/4.2.0/custom-target-5.png b/images/4.2.0/custom-target-5.png new file mode 100644 index 00000000..77bcf8bb Binary files /dev/null and b/images/4.2.0/custom-target-5.png differ diff --git a/images/4.2.0/custom-target-6.png b/images/4.2.0/custom-target-6.png new file mode 100644 index 00000000..4548b351 Binary files /dev/null and b/images/4.2.0/custom-target-6.png differ diff --git a/images/4.2.0/dashboard/add-diagnostics-card.png b/images/4.2.0/dashboard/add-diagnostics-card.png new file mode 100644 index 00000000..13afd99b Binary files /dev/null and b/images/4.2.0/dashboard/add-diagnostics-card.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-createrecording.png b/images/4.2.0/dashboard/automatedanalysis-createrecording.png new file mode 100644 index 00000000..90eab95a Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-createrecording.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-gallery.png b/images/4.2.0/dashboard/automatedanalysis-gallery.png new file mode 100644 index 00000000..5172588f Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-gallery.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-list.png b/images/4.2.0/dashboard/automatedanalysis-list.png new file mode 100644 index 00000000..34c67217 Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-list.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-noresult.png b/images/4.2.0/dashboard/automatedanalysis-noresult.png new file mode 100644 index 00000000..145f7f12 Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-noresult.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-preview.png b/images/4.2.0/dashboard/automatedanalysis-preview.png new file mode 100644 index 00000000..245129f6 Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-preview.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-result.png b/images/4.2.0/dashboard/automatedanalysis-result.png new file mode 100644 index 00000000..1c3dfe53 Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-result.png differ diff --git a/images/4.2.0/dashboard/automatedanalysis-success.png b/images/4.2.0/dashboard/automatedanalysis-success.png new file mode 100644 index 00000000..e1e312f1 Binary files /dev/null and b/images/4.2.0/dashboard/automatedanalysis-success.png differ diff --git a/images/4.2.0/dashboard/card-catalog.png b/images/4.2.0/dashboard/card-catalog.png new file mode 100644 index 00000000..e552e778 Binary files /dev/null and b/images/4.2.0/dashboard/card-catalog.png differ diff --git a/images/4.2.0/dashboard/dashboard-blanklayout.png b/images/4.2.0/dashboard/dashboard-blanklayout.png new file mode 100644 index 00000000..a2202978 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-blanklayout.png differ diff --git a/images/4.2.0/dashboard/dashboard-cardkebab.png b/images/4.2.0/dashboard/dashboard-cardkebab.png new file mode 100644 index 00000000..857c01f4 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-cardkebab.png differ diff --git a/images/4.2.0/dashboard/dashboard-cardremoved.png b/images/4.2.0/dashboard/dashboard-cardremoved.png new file mode 100644 index 00000000..406f9ad5 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-cardremoved.png differ diff --git a/images/4.2.0/dashboard/dashboard-deletelayout.png b/images/4.2.0/dashboard/dashboard-deletelayout.png new file mode 100644 index 00000000..20abf7f0 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-deletelayout.png differ diff --git a/images/4.2.0/dashboard/dashboard-layout-setastemplate.png b/images/4.2.0/dashboard/dashboard-layout-setastemplate.png new file mode 100644 index 00000000..fb17d77e Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-layout-setastemplate.png differ diff --git a/images/4.2.0/dashboard/dashboard-layoutselector-options.png b/images/4.2.0/dashboard/dashboard-layoutselector-options.png new file mode 100644 index 00000000..eda2f97f Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-layoutselector-options.png differ diff --git a/images/4.2.0/dashboard/dashboard-layoutselector.png b/images/4.2.0/dashboard/dashboard-layoutselector.png new file mode 100644 index 00000000..3b7a129f Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-layoutselector.png differ diff --git a/images/4.2.0/dashboard/dashboard-layouttemplate.png b/images/4.2.0/dashboard/dashboard-layouttemplate.png new file mode 100644 index 00000000..e9b899b2 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-layouttemplate.png differ diff --git a/images/4.2.0/dashboard/dashboard-rearrange.png b/images/4.2.0/dashboard/dashboard-rearrange.png new file mode 100644 index 00000000..f0c9c70d Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-rearrange.png differ diff --git a/images/4.2.0/dashboard/dashboard-renamelayout.png b/images/4.2.0/dashboard/dashboard-renamelayout.png new file mode 100644 index 00000000..3f29e30a Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-renamelayout.png differ diff --git a/images/4.2.0/dashboard/dashboard-resize.png b/images/4.2.0/dashboard/dashboard-resize.png new file mode 100644 index 00000000..ab5e1574 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-resize.png differ diff --git a/images/4.2.0/dashboard/dashboard-templatepicker-name.png b/images/4.2.0/dashboard/dashboard-templatepicker-name.png new file mode 100644 index 00000000..fcaffa32 Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-templatepicker-name.png differ diff --git a/images/4.2.0/dashboard/dashboard-templatepicker.png b/images/4.2.0/dashboard/dashboard-templatepicker.png new file mode 100644 index 00000000..65b152ad Binary files /dev/null and b/images/4.2.0/dashboard/dashboard-templatepicker.png differ diff --git a/images/4.2.0/dashboard/diagnostics-preview.png b/images/4.2.0/dashboard/diagnostics-preview.png new file mode 100644 index 00000000..1e3467ac Binary files /dev/null and b/images/4.2.0/dashboard/diagnostics-preview.png differ diff --git a/images/4.2.0/dashboard/diagnostics.png b/images/4.2.0/dashboard/diagnostics.png new file mode 100644 index 00000000..bd6703e8 Binary files /dev/null and b/images/4.2.0/dashboard/diagnostics.png differ diff --git a/images/4.2.0/dashboard/jfrmetrics-configuration.png b/images/4.2.0/dashboard/jfrmetrics-configuration.png new file mode 100644 index 00000000..ff11a0cc Binary files /dev/null and b/images/4.2.0/dashboard/jfrmetrics-configuration.png differ diff --git a/images/4.2.0/dashboard/jfrmetrics-no-source.png b/images/4.2.0/dashboard/jfrmetrics-no-source.png new file mode 100644 index 00000000..a0d4ee92 Binary files /dev/null and b/images/4.2.0/dashboard/jfrmetrics-no-source.png differ diff --git a/images/4.2.0/dashboard/jfrmetrics-preview.png b/images/4.2.0/dashboard/jfrmetrics-preview.png new file mode 100644 index 00000000..1889af8a Binary files /dev/null and b/images/4.2.0/dashboard/jfrmetrics-preview.png differ diff --git a/images/4.2.0/dashboard/jfrmetrics.png b/images/4.2.0/dashboard/jfrmetrics.png new file mode 100644 index 00000000..450f585c Binary files /dev/null and b/images/4.2.0/dashboard/jfrmetrics.png differ diff --git a/images/4.2.0/dashboard/mbeanmetrics-configuration.png b/images/4.2.0/dashboard/mbeanmetrics-configuration.png new file mode 100644 index 00000000..2fd2ec75 Binary files /dev/null and b/images/4.2.0/dashboard/mbeanmetrics-configuration.png differ diff --git a/images/4.2.0/dashboard/mbeanmetrics-preview.png b/images/4.2.0/dashboard/mbeanmetrics-preview.png new file mode 100644 index 00000000..4b536273 Binary files /dev/null and b/images/4.2.0/dashboard/mbeanmetrics-preview.png differ diff --git a/images/4.2.0/dashboard/mbeanmetrics.png b/images/4.2.0/dashboard/mbeanmetrics.png new file mode 100644 index 00000000..f23d6247 Binary files /dev/null and b/images/4.2.0/dashboard/mbeanmetrics.png differ diff --git a/images/4.2.0/dashboard/targetjvmdetails-details.png b/images/4.2.0/dashboard/targetjvmdetails-details.png new file mode 100644 index 00000000..d74e45dc Binary files /dev/null and b/images/4.2.0/dashboard/targetjvmdetails-details.png differ diff --git a/images/4.2.0/dashboard/targetjvmdetails-lineage.png b/images/4.2.0/dashboard/targetjvmdetails-lineage.png new file mode 100644 index 00000000..231c4470 Binary files /dev/null and b/images/4.2.0/dashboard/targetjvmdetails-lineage.png differ diff --git a/images/4.2.0/dashboard/targetjvmdetails-preview.png b/images/4.2.0/dashboard/targetjvmdetails-preview.png new file mode 100644 index 00000000..15fc8abb Binary files /dev/null and b/images/4.2.0/dashboard/targetjvmdetails-preview.png differ diff --git a/images/4.2.0/dashboard/targetjvmdetails-resources.png b/images/4.2.0/dashboard/targetjvmdetails-resources.png new file mode 100644 index 00000000..05a1bd5d Binary files /dev/null and b/images/4.2.0/dashboard/targetjvmdetails-resources.png differ diff --git a/images/4.2.0/download-an-active-or-archived-recording-1.png b/images/4.2.0/download-an-active-or-archived-recording-1.png new file mode 100644 index 00000000..2e210495 Binary files /dev/null and b/images/4.2.0/download-an-active-or-archived-recording-1.png differ diff --git a/images/4.2.0/download-an-active-or-archived-recording-2.png b/images/4.2.0/download-an-active-or-archived-recording-2.png new file mode 100644 index 00000000..8350f9d3 Binary files /dev/null and b/images/4.2.0/download-an-active-or-archived-recording-2.png differ diff --git a/images/4.2.0/download-an-automated-rule-1.png b/images/4.2.0/download-an-automated-rule-1.png new file mode 100644 index 00000000..e9a4384a Binary files /dev/null and b/images/4.2.0/download-an-automated-rule-1.png differ diff --git a/images/4.2.0/download-edit-and-upload-a-customized-event-template-1.png b/images/4.2.0/download-edit-and-upload-a-customized-event-template-1.png new file mode 100644 index 00000000..b4581daa Binary files /dev/null and b/images/4.2.0/download-edit-and-upload-a-customized-event-template-1.png differ diff --git a/images/4.2.0/download-edit-and-upload-a-customized-event-template-2.png b/images/4.2.0/download-edit-and-upload-a-customized-event-template-2.png new file mode 100644 index 00000000..b5ce3054 Binary files /dev/null and b/images/4.2.0/download-edit-and-upload-a-customized-event-template-2.png differ diff --git a/images/4.2.0/download-edit-and-upload-a-customized-event-template-3.png b/images/4.2.0/download-edit-and-upload-a-customized-event-template-3.png new file mode 100644 index 00000000..b204d8cd Binary files /dev/null and b/images/4.2.0/download-edit-and-upload-a-customized-event-template-3.png differ diff --git a/images/4.2.0/download-edit-and-upload-a-customized-event-template-4.png b/images/4.2.0/download-edit-and-upload-a-customized-event-template-4.png new file mode 100644 index 00000000..1059ca68 Binary files /dev/null and b/images/4.2.0/download-edit-and-upload-a-customized-event-template-4.png differ diff --git a/images/4.2.0/download-edit-and-upload-a-customized-event-template-5.png b/images/4.2.0/download-edit-and-upload-a-customized-event-template-5.png new file mode 100644 index 00000000..caaa9002 Binary files /dev/null and b/images/4.2.0/download-edit-and-upload-a-customized-event-template-5.png differ diff --git a/images/4.2.0/edit-template-with-jmc-1.png b/images/4.2.0/edit-template-with-jmc-1.png new file mode 100644 index 00000000..1ba9fa7a Binary files /dev/null and b/images/4.2.0/edit-template-with-jmc-1.png differ diff --git a/images/4.2.0/edit-template-with-jmc-2.png b/images/4.2.0/edit-template-with-jmc-2.png new file mode 100644 index 00000000..55438ab0 Binary files /dev/null and b/images/4.2.0/edit-template-with-jmc-2.png differ diff --git a/images/4.2.0/edit-template-with-jmc-3.png b/images/4.2.0/edit-template-with-jmc-3.png new file mode 100644 index 00000000..44df1d90 Binary files /dev/null and b/images/4.2.0/edit-template-with-jmc-3.png differ diff --git a/images/4.2.0/edit-template-with-jmc-4.png b/images/4.2.0/edit-template-with-jmc-4.png new file mode 100644 index 00000000..38718d05 Binary files /dev/null and b/images/4.2.0/edit-template-with-jmc-4.png differ diff --git a/images/4.2.0/edit-template-with-jmc-5.png b/images/4.2.0/edit-template-with-jmc-5.png new file mode 100644 index 00000000..d3f0651e Binary files /dev/null and b/images/4.2.0/edit-template-with-jmc-5.png differ diff --git a/images/4.2.0/edit-template-with-jmc-6.png b/images/4.2.0/edit-template-with-jmc-6.png new file mode 100644 index 00000000..bb7aceda Binary files /dev/null and b/images/4.2.0/edit-template-with-jmc-6.png differ diff --git a/images/4.2.0/guided-tour.png b/images/4.2.0/guided-tour.png new file mode 100644 index 00000000..3d47880c Binary files /dev/null and b/images/4.2.0/guided-tour.png differ diff --git a/images/4.2.0/masthead-help.png b/images/4.2.0/masthead-help.png new file mode 100644 index 00000000..befcf1de Binary files /dev/null and b/images/4.2.0/masthead-help.png differ diff --git a/images/4.2.0/navigate-to-all-archives.png b/images/4.2.0/navigate-to-all-archives.png new file mode 100644 index 00000000..624faddb Binary files /dev/null and b/images/4.2.0/navigate-to-all-archives.png differ diff --git a/images/4.2.0/navigate-to-all-targets.png b/images/4.2.0/navigate-to-all-targets.png new file mode 100644 index 00000000..73adcd7e Binary files /dev/null and b/images/4.2.0/navigate-to-all-targets.png differ diff --git a/images/4.2.0/navigate-to-dashboard.png b/images/4.2.0/navigate-to-dashboard.png new file mode 100644 index 00000000..1fe8eef3 Binary files /dev/null and b/images/4.2.0/navigate-to-dashboard.png differ diff --git a/images/4.2.0/navigate-to-event-types-1.png b/images/4.2.0/navigate-to-event-types-1.png new file mode 100644 index 00000000..ca160f29 Binary files /dev/null and b/images/4.2.0/navigate-to-event-types-1.png differ diff --git a/images/4.2.0/navigate-to-events-1.png b/images/4.2.0/navigate-to-events-1.png new file mode 100644 index 00000000..258c8e40 Binary files /dev/null and b/images/4.2.0/navigate-to-events-1.png differ diff --git a/images/4.2.0/navigate-to-events-2.png b/images/4.2.0/navigate-to-events-2.png new file mode 100644 index 00000000..328c1013 Binary files /dev/null and b/images/4.2.0/navigate-to-events-2.png differ diff --git a/images/4.2.0/navigate-to-recordings-1.png b/images/4.2.0/navigate-to-recordings-1.png new file mode 100644 index 00000000..fce9222f Binary files /dev/null and b/images/4.2.0/navigate-to-recordings-1.png differ diff --git a/images/4.2.0/navigate-to-recordings-2.png b/images/4.2.0/navigate-to-recordings-2.png new file mode 100644 index 00000000..aba527e7 Binary files /dev/null and b/images/4.2.0/navigate-to-recordings-2.png differ diff --git a/images/4.2.0/navigate-to-security.png b/images/4.2.0/navigate-to-security.png new file mode 100644 index 00000000..e5cfe225 Binary files /dev/null and b/images/4.2.0/navigate-to-security.png differ diff --git a/images/4.2.0/navigate-to-settings.png b/images/4.2.0/navigate-to-settings.png new file mode 100644 index 00000000..e307d04e Binary files /dev/null and b/images/4.2.0/navigate-to-settings.png differ diff --git a/images/4.2.0/navigate-to-topology.png b/images/4.2.0/navigate-to-topology.png new file mode 100644 index 00000000..a1b7fad6 Binary files /dev/null and b/images/4.2.0/navigate-to-topology.png differ diff --git a/images/4.2.0/notifications-setting.png b/images/4.2.0/notifications-setting.png new file mode 100644 index 00000000..851d2989 Binary files /dev/null and b/images/4.2.0/notifications-setting.png differ diff --git a/images/4.2.0/quick-start-catalog.png b/images/4.2.0/quick-start-catalog.png new file mode 100644 index 00000000..31d7128e Binary files /dev/null and b/images/4.2.0/quick-start-catalog.png differ diff --git a/images/4.2.0/re-upload-a-recording-to-archives-1.png b/images/4.2.0/re-upload-a-recording-to-archives-1.png new file mode 100644 index 00000000..4d195332 Binary files /dev/null and b/images/4.2.0/re-upload-a-recording-to-archives-1.png differ diff --git a/images/4.2.0/re-upload-a-recording-to-archives-2.png b/images/4.2.0/re-upload-a-recording-to-archives-2.png new file mode 100644 index 00000000..e2049c98 Binary files /dev/null and b/images/4.2.0/re-upload-a-recording-to-archives-2.png differ diff --git a/images/4.2.0/re-upload-a-recording-to-archives-3.png b/images/4.2.0/re-upload-a-recording-to-archives-3.png new file mode 100644 index 00000000..f6315b52 Binary files /dev/null and b/images/4.2.0/re-upload-a-recording-to-archives-3.png differ diff --git a/images/4.2.0/re-upload-a-recording-to-archives-4.png b/images/4.2.0/re-upload-a-recording-to-archives-4.png new file mode 100644 index 00000000..b42984fa Binary files /dev/null and b/images/4.2.0/re-upload-a-recording-to-archives-4.png differ diff --git a/images/4.2.0/select-a-recording.png b/images/4.2.0/select-a-recording.png new file mode 100644 index 00000000..ea02972c Binary files /dev/null and b/images/4.2.0/select-a-recording.png differ diff --git a/images/4.2.0/select-target-application.png b/images/4.2.0/select-target-application.png new file mode 100644 index 00000000..636d4f6e Binary files /dev/null and b/images/4.2.0/select-target-application.png differ diff --git a/images/4.2.0/snapshot-a-recording-1.png b/images/4.2.0/snapshot-a-recording-1.png new file mode 100644 index 00000000..381e41f5 Binary files /dev/null and b/images/4.2.0/snapshot-a-recording-1.png differ diff --git a/images/4.2.0/snapshot-a-recording-2.png b/images/4.2.0/snapshot-a-recording-2.png new file mode 100644 index 00000000..19c7453c Binary files /dev/null and b/images/4.2.0/snapshot-a-recording-2.png differ diff --git a/images/4.2.0/startstop-a-recording-1.png b/images/4.2.0/startstop-a-recording-1.png new file mode 100644 index 00000000..91f8d502 Binary files /dev/null and b/images/4.2.0/startstop-a-recording-1.png differ diff --git a/images/4.2.0/startstop-a-recording-2.png b/images/4.2.0/startstop-a-recording-2.png new file mode 100644 index 00000000..f238da01 Binary files /dev/null and b/images/4.2.0/startstop-a-recording-2.png differ diff --git a/images/4.2.0/startstop-a-recording-3.png b/images/4.2.0/startstop-a-recording-3.png new file mode 100644 index 00000000..2191c2e3 Binary files /dev/null and b/images/4.2.0/startstop-a-recording-3.png differ diff --git a/images/4.2.0/store-credentials-1.png b/images/4.2.0/store-credentials-1.png new file mode 100644 index 00000000..ad8f1514 Binary files /dev/null and b/images/4.2.0/store-credentials-1.png differ diff --git a/images/4.2.0/store-credentials-2.png b/images/4.2.0/store-credentials-2.png new file mode 100644 index 00000000..eefa2090 Binary files /dev/null and b/images/4.2.0/store-credentials-2.png differ diff --git a/images/4.2.0/store-credentials-3.png b/images/4.2.0/store-credentials-3.png new file mode 100644 index 00000000..8b1f333f Binary files /dev/null and b/images/4.2.0/store-credentials-3.png differ diff --git a/images/4.2.0/topology-1.png b/images/4.2.0/topology-1.png new file mode 100644 index 00000000..a1b7fad6 Binary files /dev/null and b/images/4.2.0/topology-1.png differ diff --git a/images/4.2.0/topology-2.png b/images/4.2.0/topology-2.png new file mode 100644 index 00000000..e2f2387d Binary files /dev/null and b/images/4.2.0/topology-2.png differ diff --git a/images/4.2.0/topology-3.png b/images/4.2.0/topology-3.png new file mode 100644 index 00000000..5f97a860 Binary files /dev/null and b/images/4.2.0/topology-3.png differ diff --git a/images/4.2.0/topology-4.png b/images/4.2.0/topology-4.png new file mode 100644 index 00000000..9647f253 Binary files /dev/null and b/images/4.2.0/topology-4.png differ diff --git a/images/4.2.0/topology-5.png b/images/4.2.0/topology-5.png new file mode 100644 index 00000000..d0ee7260 Binary files /dev/null and b/images/4.2.0/topology-5.png differ diff --git a/images/4.2.0/topology-6.png b/images/4.2.0/topology-6.png new file mode 100644 index 00000000..e1d756e2 Binary files /dev/null and b/images/4.2.0/topology-6.png differ diff --git a/images/4.2.0/topology-7.png b/images/4.2.0/topology-7.png new file mode 100644 index 00000000..fd0c6c93 Binary files /dev/null and b/images/4.2.0/topology-7.png differ diff --git a/images/4.2.0/upload-an-automated-rule-1.png b/images/4.2.0/upload-an-automated-rule-1.png new file mode 100644 index 00000000..36844733 Binary files /dev/null and b/images/4.2.0/upload-an-automated-rule-1.png differ diff --git a/images/4.2.0/upload-an-automated-rule-2.png b/images/4.2.0/upload-an-automated-rule-2.png new file mode 100644 index 00000000..8a75a926 Binary files /dev/null and b/images/4.2.0/upload-an-automated-rule-2.png differ diff --git a/images/4.2.0/view-archives-recordings-1.png b/images/4.2.0/view-archives-recordings-1.png new file mode 100644 index 00000000..22470349 Binary files /dev/null and b/images/4.2.0/view-archives-recordings-1.png differ diff --git a/images/4.2.0/view-archives-recordings-2.png b/images/4.2.0/view-archives-recordings-2.png new file mode 100644 index 00000000..8d0067a2 Binary files /dev/null and b/images/4.2.0/view-archives-recordings-2.png differ diff --git a/images/4.2.0/view-in-grafana-1.png b/images/4.2.0/view-in-grafana-1.png new file mode 100644 index 00000000..fe8b5e50 Binary files /dev/null and b/images/4.2.0/view-in-grafana-1.png differ diff --git a/images/4.2.0/view-in-grafana-2.png b/images/4.2.0/view-in-grafana-2.png new file mode 100644 index 00000000..994f5aaf Binary files /dev/null and b/images/4.2.0/view-in-grafana-2.png differ diff --git a/images/4.2.0/welcome-tour.png b/images/4.2.0/welcome-tour.png new file mode 100644 index 00000000..2bab7065 Binary files /dev/null and b/images/4.2.0/welcome-tour.png differ diff --git a/version/4.1.0/guides/_subsections/add-a-trusted-certificate.md b/version/4.1.0/guides/_subsections/add-a-trusted-certificate.md new file mode 100644 index 00000000..42a89cc9 --- /dev/null +++ b/version/4.1.0/guides/_subsections/add-a-trusted-certificate.md @@ -0,0 +1,35 @@ +## [Add a Trusted Certificate](#add-a-trusted-certificate) +If you have Java Management Extensions **(JMX)** over `SSL` enabled on your containerized **JVMs**, you must configure **Cryostat** to trust the `SSL/TLS` certificate presented by the containerized **JVM** when **Cryostat** attempts to open a **JMX** connection. If you do not complete this configuration, **Cryostat** cannot open a **JMX** connection for the purposes of performing **JFR** management tasks. + +
      +
    1. + {% include howto_step.html + summary="Navigate to the Security Tab" + image-name="4.0.0/navigate-to-security.png" + text="Click the Security tab. This should initially be in an empty state if you have not yet defined any additional trusted certificates." + %} +
    2. +
    + +In order to add a trusted certificate to Cryostat's custom truststore you must first determine the directory that Cryostat loads certificates from. +This is controlled by the configuration property `ssl.truststore.dir` and defaults to `/truststore`. If you are deploying Cryostat manually in an +environment like Podman or Docker Compose, you should create a volume containing the certificates and mount it to this location, or bind-mount a host +directory to this location. If you are using the Cryostat Helm Chart then you should create Secrets containing each trusted certificate and mount +each within this location. If you are using the Cryostat Operator, you should use the `.Spec.TrustedCertSecrets` `CR` property. + +Once you have loaded your additional certificates to the truststore you must restart the Cryostat container, since it can only load certificates +into the JVM truststore at startup time. The container may be restarted automatically when you modify the configuration, depending on your deployment +platform. + +After you have loaded the certificates and verified that the Cryostat container has restarted, you can verify that Cryostat correctly found the +certificate(s) within the truststore directory. + +
      +
    1. + {% include howto_step.html + summary="Navigate to the Security Tab" + image-name="4.0.0/navigate-to-security-with-certs.png" + text="Click the Security tab. The file paths of any additional trusted certificates you have added should appear in the list." + %} +
    2. +
    diff --git a/version/4.1.0/guides/_subsections/add-and-edit-recording-metadata-labels.md b/version/4.1.0/guides/_subsections/add-and-edit-recording-metadata-labels.md new file mode 100644 index 00000000..9bae41fa --- /dev/null +++ b/version/4.1.0/guides/_subsections/add-and-edit-recording-metadata-labels.md @@ -0,0 +1,83 @@ +## [Add and Edit Recording Metadata Labels](#add-and-edit-recording-metadata-labels) +Users can attach `Metadata` or `Custom Labels` to **JDK** `Flight Recordings` managed by **Cryostat**. `Recording Labels` can be used to identify `Recordings` during queries or perform actions on multiple `Recordings` containing the same `Labels`. Here’s how to *Add* and *Edit* `Metadata Labels` on your **JDK** `Flight Recordings`. + +
      +
    1. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    2. +
    3. + {% include_relative _subsections/common/click-create.md %} +
    4. +
    5. + {% include howto_step.html + summary="Add Metadata Labels to the Create Recording form" + image-name="4.0.0/add-and-edit-recording-metadata-labels-1.png" + text=" + When creating a custom Flight Recording with Cryostat, expand the form section Show metadata options. Click Add Label and add key-Value Label pairs to the form. Finally, click Create to attach the Labels and create the Recording. + " + %} +
    6. +
    7. + {% include howto_step.html + summary="View your Labels on the Active Recordings Table" + image-name="4.0.0/add-and-edit-recording-metadata-labels-2.png" + text=" + The new Recording will appear in the Recordings Tab with your Custom Label as well as default Labels containing information about the selected Recording template. + " + %} +
    8. +
    9. + {% capture edit-an-existing-label-text %} +

      + Recording Labels can also be edited after Recordings have been created or re-uploaded to archives. It looks like the Custom Label in our example contains a typo - we can fix the typo by editing the Label. First select a Recording from the table with the 🗹 checkbox. Then, click the Edit Labels button to bring up the label drawer. Finally, click the Edit button that appears from the drawer. +

      + + + +

      + The Labels section will appear as a form where you can Add, Edit, or Delete existing Labels, just like before when we created the Recording. Fix the typo, and click Save to save your edited Labels. +

      + {% endcapture %} + {% include howto_step.html + summary="Edit an Existing Label" + image-name="4.0.0/add-and-edit-recording-metadata-labels-3.png" + text=edit-an-existing-label-text + %} +
    10. +
    11. + {% include howto_step.html + summary="View your edited Labels" + image-name="4.0.0/add-and-edit-recording-metadata-labels-5.png" + text=" + The Recording Labels should be updated in the Active Recordings table. + " + %} +
    12. +
    13. + {% include howto_step.html + summary="(Optional) Archive your Recording to view Labels copied onto the Archived Recording" + image-name="4.0.0/add-and-edit-recording-metadata-labels-6.png" + text=" + On the Active Recordings table, click the Checkbox next to the Recording, then click Archive to archive your Recording. Notice that the Archived Recording also copies the Labels from the Active Recording. You can also add Labels to any Recording uploaded to Cryostat’s archives. + " + %} +
    14. +
    15. + {% capture bulk-edit-recording-labels-text %} +

      + Create another Recording on the same target. Then select both Recordings on the Recordings Table and click Edit Labels and start editing. This time, only Labels that are present on both Recordings will be shown in the form. Let's Delete the two common template-related Labels, and Add a new Label to both Recordings. Then finally, click Save. +

      + + + +

      + Congratulations, you have successfully bulk-edited Labels across multiple Recordings! +

      + {% endcapture %} + {% include howto_step.html + summary="(Optional) Bulk-edit Recording Labels across multiple Recordings" + image-name="4.0.0/add-and-edit-recording-metadata-labels-7.png" + text=bulk-edit-recording-labels-text + %} +
    16. +
    diff --git a/version/4.1.0/guides/_subsections/archive-a-recording.md b/version/4.1.0/guides/_subsections/archive-a-recording.md new file mode 100644 index 00000000..b7b33915 --- /dev/null +++ b/version/4.1.0/guides/_subsections/archive-a-recording.md @@ -0,0 +1,55 @@ +## [Archive a Recording](#archive-a-recording) +In contrast to `Active Recordings`, which reside within the container +of the `target` application, `Archived Recordings` reside within persistent +storage attached to a **Cryostat** instance. In **OpenShift**, for example, the +archives are stored in a `PersistentVolumeClaim`. + +`Archived Recordings` are created by performing archival upon `Active Recordings`. +When this is requested, **Cryostat** connects to the `target` application and copies +the `Flight Recorder` data from the selected `Active Recording` into an `Archived +Recording` file in storage. The `Active Source Recording` may be `Continuous` or +`Fixed-duration`, using any *Event Template*, in +any state (`RUNNING`, `STOPPED`, etc.), and may even be a `snapshot`. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md %} +
    2. +
    3. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    4. +
    5. + {% capture select-recording-additional-content %} +

      + If you do not have any Recordings present in the Active Recordings + view, follow + Start/Stop a Recording + to create one, or select a different target application. +

      + {% endcapture %} + {% include howto_step.html + summary="Select an Active Recording" + image-name="4.0.0/archive-a-recording-1.png" + caption=select-recording-additional-content + %} +
    6. +
    7. + Click the Archive button +
    8. +
    9. + {% include howto_step.html + summary="Navigate to the Archived Recordings tab" + image-name="4.0.0/archive-a-recording-2.png" + caption=" + Once the Recording has been archived, a new entry will appear in the + target JVM's Archived Recordings table. All Recordings that were + saved from the current target will be listed here in their own table. + Switching to a different target from the dropdown will list only the + Recordings archived from that source target. The name of the Archived + Recording reflects the address of the target application, the original + name of the Active Recording that it was retrieved from, and includes a + timestamp indicating when the Archived Recording was created. + " + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/automated-analysis.md b/version/4.1.0/guides/_subsections/automated-analysis.md new file mode 100644 index 00000000..e82048f4 --- /dev/null +++ b/version/4.1.0/guides/_subsections/automated-analysis.md @@ -0,0 +1,53 @@ +## [View Automated Analysis for a Recording](#view-automated-analysis-for-a-recording) +**Cryostat** integrates the same `Automated Analysis` reports that you would +find in [JDK Mission Control ("JMC")](https://github.com/openjdk/jmc). The +**JMC** rules engine analyzes your `Recording` and looks for common problems, +assigning a severity score from 0 (no problem) to 100 (potentially +severe problem) to each potential problem type. + +**Cryostat** also provides an `Automated Analysis Card` that is able to display +the same information in a more flexible format, with more tools and control +over the data you see and the ability to resize the view. The `Card` is available +for use in the *Dashboard*. Read the section on the +[`Automated Analysis Card`](#automated-analysis-card) for more information. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md %} +
    2. +
    3. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    4. +
    5. + {% include_relative _subsections/common/select-a-recording.md + select-a-recording-caption=" + If you do not have any Recordings present in the Active Recordings + view, follow + Start/Stop a Recording + to create one, or select a different target application. + You may also select an Archived Recording for Automated Analysis. + " + %} +
    6. +
    7. + {% include howto_step.html + summary="Expand the Recording" + image-name="4.0.0/automated-analysis-1.png" + caption=" + Expand the Recording with the Chevron to the left of the Recording + name. The Automated Analysis report will appear below the Recording. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="View Details and Suggestions for Results" + image-name="4.0.0/automated-analysis-2.png" + caption=" + Click on each result to view + specifics on what the result means and possible suggestions to fix + the potential problem. + " + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/common/card-catalog.md b/version/4.1.0/guides/_subsections/common/card-catalog.md new file mode 100644 index 00000000..ee78088c --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/card-catalog.md @@ -0,0 +1,9 @@ +{% capture card-catalog-include-text %} + The Dashboard Card Catalog contains a list of available cards that can be added to the Dashboard. Clicking on a card will open a panel containing a preview. +{% endcapture %} +{% include howto_step.html + summary="Open the Card Catalog" + image-name="4.0.0/dashboard/card-catalog.png" + caption="Open the Card Catalog by clicking the Catalog icon on the Dashboard toolbar." + text=card-catalog-include-text +%} diff --git a/version/4.1.0/guides/_subsections/common/click-create.md b/version/4.1.0/guides/_subsections/common/click-create.md new file mode 100644 index 00000000..fa2afe2c --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/click-create.md @@ -0,0 +1,4 @@ +{% include howto_step.html + summary="Click Create" + image-name="4.0.0/click-create.png" +%} diff --git a/version/4.1.0/guides/_subsections/common/layout-selector.md b/version/4.1.0/guides/_subsections/common/layout-selector.md new file mode 100644 index 00000000..ad5d6531 --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/layout-selector.md @@ -0,0 +1,9 @@ +{% capture layout-selector-text %} +The Layout Selector contains a list of all available layouts. The currently selected layout is indicated with a check mark "✓". +{% endcapture %} +{% include howto_step.html +summary="Open the Layout Selector Dropdown" +image-name="4.0.0/dashboard/dashboard-layoutselector.png" +caption="Click the layout selector dropdown to view the available layouts." +text=layout-selector-text +%} diff --git a/version/4.1.0/guides/_subsections/common/navigate-to-dashboard.md b/version/4.1.0/guides/_subsections/common/navigate-to-dashboard.md new file mode 100644 index 00000000..9977b6a2 --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/navigate-to-dashboard.md @@ -0,0 +1,9 @@ +{% capture navigate-to-dashboard-include-text %} + The Cryostat Dashboard provides a high-level overview of the state of your Cryostat instance and the target JVM applications it is monitoring. +{% endcapture %} +{% include howto_step.html + summary="Navigate to Dashboard" + image-name="4.0.0/navigate-to-dashboard.png" + caption="Add dashboard cards, switch between dashboard layouts, and modify the layout configuration to suit your needs." + text=navigate-to-dashboard-include-text +%} diff --git a/version/4.1.0/guides/_subsections/common/navigate-to-recordings.md b/version/4.1.0/guides/_subsections/common/navigate-to-recordings.md new file mode 100644 index 00000000..28a91716 --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/navigate-to-recordings.md @@ -0,0 +1,20 @@ +{% capture navigate-to-recordings-include-text %} + If the target JVM has SSL/TLS enabled on JMX connections, it may be + necessary to add the target's certificate to Cryostat's trust store. Go + to Add a Trusted Certificate + and return to this section after completing that guide. + + + + {{ include.additional-content }} +{% endcapture %} +{% include howto_step.html + summary="Navigate to Recordings" + image-name="4.0.0/navigate-to-recordings-1.png" + caption=" + Supply JMX credentials to authenticate to the target, if necessary. If + the target is not configured with JMX authentication then the + connection attempt will continue without prompting for credentials. + " + text=navigate-to-recordings-include-text +%} diff --git a/version/4.1.0/guides/_subsections/common/navigate-to-settings.md b/version/4.1.0/guides/_subsections/common/navigate-to-settings.md new file mode 100644 index 00000000..e03dc135 --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/navigate-to-settings.md @@ -0,0 +1,14 @@ +{% capture navigate-to-settings-include-text %} + The Settings view contains web-client instance configuration settings. These + affect the appearance or behaviour of the web-client frontend only, not the + behaviour of the Cryostat backend server. These frontend settings are persisted + to web browser local storage only. +{% endcapture %} +{% include howto_step.html + summary="Navigate to Settings" + image-name="4.0.0/navigate-to-settings.png" + caption=" + Click the cog or gear icon in the application masthead to access the Settings view. + " + text=navigate-to-settings-include-text +%} diff --git a/version/4.1.0/guides/_subsections/common/navigate-to-topology.md b/version/4.1.0/guides/_subsections/common/navigate-to-topology.md new file mode 100644 index 00000000..aabe1e96 --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/navigate-to-topology.md @@ -0,0 +1,9 @@ +{% capture navigate-to-topology-include-text %} + When you need to view or perform actions on multiple target JVMs at the same time, Topology View is the way. +{% endcapture %} +{% include howto_step.html + summary="Navigate to Topology" + image-name="4.0.0/navigate-to-topology.png" + caption="Use the bottom Control Bar to adjust the Graph View as needed." + text=navigate-to-topology-include-text +%} diff --git a/version/4.1.0/guides/_subsections/common/select-a-recording.md b/version/4.1.0/guides/_subsections/common/select-a-recording.md new file mode 100644 index 00000000..5ded5e32 --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/select-a-recording.md @@ -0,0 +1,12 @@ +{% capture caption-content %} + {{ include.select-a-recording-caption }} +{% endcapture %} +{% capture text-content %} + {{ include.select-a-recording-additional-content }} +{% endcapture %} +{% include howto_step.html + summary="Select a Recording" + image-name="4.0.0/select-a-recording.png" + caption=caption-content + text=text-content +%} diff --git a/version/4.1.0/guides/_subsections/common/select-target-application.md b/version/4.1.0/guides/_subsections/common/select-target-application.md new file mode 100644 index 00000000..c3d9931c --- /dev/null +++ b/version/4.1.0/guides/_subsections/common/select-target-application.md @@ -0,0 +1,13 @@ +{% capture caption-content %} + {{ include.select-target-application-caption }} +{% endcapture %} +{% capture text-content %} + If you wish to create a Custom Target from here, click Create Target displayed at the bottom. Go to Create a Custom Target and proceed from step 3. + Also, see Using the Cryostat Agent section to help discover other targets. +{% endcapture %} +{% include howto_step.html + summary="Select the Target Application" + image-name="4.0.0/select-target-application.png" + caption="Clik the Dropdown arrow on the right side of Target prompt to select or create a target." + text=text-content +%} diff --git a/version/4.1.0/guides/_subsections/configure-agent-harvester.md b/version/4.1.0/guides/_subsections/configure-agent-harvester.md new file mode 100644 index 00000000..75adaf45 --- /dev/null +++ b/version/4.1.0/guides/_subsections/configure-agent-harvester.md @@ -0,0 +1,44 @@ +## [Configure the Agent Harvester](#configure-agent-harvester) + +The **Cryostat Agent** contains a **Harvester** feature that allows you to start a new recording with a given event template on agent initialization, and periodically push the collected **JFR** data to the associated **Cryostat** server. The **Agent** will also attempt to push the tail end of this recording on **JVM** shutdown so that the cause of an unexpected **JVM** shutdown can be captured for later analysis. + +The **Harvester** supports a number of configuration options that can be used to determine how often it pushes the collected **JFR** data, the template to be used and limitations on how much data to collect, as well as how long the upload may take. The following configuration options are available: + +- `cryostat.agent.harvester.period-ms` [`long`]: the length of time between JFR collections and pushes by the harvester. This also controls the maximum age of data stored in the buffer for the harvester's managed Flight Recording. Every `period-ms` the harvester will upload a JFR binary file to the `cryostat.agent.baseuri` archives. Default `-1`, which indicates no scheduled harvest uploading will be performed. +- `cryostat.agent.harvester.template` [`String`]: the name of the `.jfc` event template configuration to use for the harvester's managed Flight Recording. For example, if the application image contains `/usr/lib/jvm/java-17-openjdk/lib/jfr/default.jfc` then this value would be simply be `default`. This can also be the value of the `label` attribute of the root element within that file, for example `Continuous`. Defaults to the empty string, so that no recording is started. +- `cryostat.agent.harvester.max-files` [`String`]: the maximum number of pushed files that Cryostat will keep from the agent. This is included with the harvester's push requests and instructs Cryostat to prune, in a FIFO manner, the oldest JFR files within the attached JVM target's storage, while the number of stored recordings is greater than this configuration's maximum file limit. Default `2147483647` (`Integer.MAX_VALUE`). +- `cryostat.agent.harvester.upload.timeout-ms` [`long`]: the duration in milliseconds to wait for HTTP upload requests to the Cryostat server to complete and respond. Default `30000`. +- `cryostat.agent.harvester.exit.max-age-ms` [`long`]: the JFR `maxage` setting, specified in milliseconds, to apply to recording data uploaded to the Cryostat server when the JVM this Agent instance is attached to exits. This ensures that tail-end data is captured between the last periodic push and the application exit. Exit uploads only occur when the application receives `SIGINT`/`SIGTERM` from the operating system or container platform. +- `cryostat.agent.harvester.exit.max-size-b` [`long`]: the JFR `maxsize` setting, specified in bytes, to apply to exit uploads as described above. +- `cryostat.agent.harvester.max-age-ms` [`long`]: the JFR `maxage` setting, specified in milliseconds, to apply to periodic uploads during the application lifecycle. Defaults to `0`, which is interpreted as 1.5x the harvester period (`cryostat.agent.harvester.period-ms`). +- `cryostat.agent.harvester.max-size-b` [`long`]: the JFR `maxsize` setting, specified in bytes, to apply to periodic uploads during the application lifecycle. Defaults to `0`, which means `unlimited`. + +Note that the **Harvester Period** and **Template** options must be set for the **Harvester** to regularly push **JFR** data. If only the **Template** is set the **Harvester** will only attempt to push on shutdown. If neither are set the **Harvester** will not do anything unless configured alongside **Smart Triggers** as described below. + +These configuration options may be set either as **JVM** system properties, for example: + +``` +-Dcryostat.agent.harvester.period-ms=1000 +-Dcryostat.agent.harvester.template=Profiling +``` + +or by setting them as environment variables, for example: + +``` +- name: CRYOSTAT_AGENT_HARVESTER_PERIOD_MS + value: 1000 +- name: CRYOSTAT_AGENT_HARVESTER_TEMPLATE + value: Profiling +``` +#### [Mbean Trigger Integration](#mbean-trigger-integration) + +When the **Cryostat Agent** is configured to start dynamic recordings based on custom MBean triggers, you can also integrate them with the **Harvester** to automatically push the collected **JFR** data to the **Cryostat Server**. + +By defining MBean custom triggers and an agent harvester period without a harvester template, you can achieve a setup where the agent does both of the following: + +- Agent dynamically starts JFR recordings based on MBean custom triggers. +- Agent uses configured harvester periods to periodically capture snapshots of the recording data and upload this data to the Cryostat server. + +In this situation, the agent will continue to capture recording data until you manually stop the dynamic JFR recording or the host JVM shuts down. + +For instructions on how to install the **Cryostat Agent** into your applications, [check the Setup section in Getting Started](/get-started/#using-the-cryostat-agent). diff --git a/version/4.1.0/guides/_subsections/configure-feature-level.md b/version/4.1.0/guides/_subsections/configure-feature-level.md new file mode 100644 index 00000000..8b6cbf28 --- /dev/null +++ b/version/4.1.0/guides/_subsections/configure-feature-level.md @@ -0,0 +1,19 @@ +### [Configure Feature Level](#configure-feature-level) +Some features in the **web-client** UI are *Beta*-level features. This indicates that they are still underdoing design and development, and may have significant limitations, or be redesigned or even removed in the future. + +For those reasons, *Beta* features are hidden by default in the **Cryostat** UI. They can be enabled by following the steps below. + +
      +
    1. + {% include_relative _subsections/common/navigate-to-settings.md %} +
    2. +
    3. + {% include howto_step.html + summary="Locate the Advanced settings" + image-name="4.0.0/advanced-setting.png" + text=" + The Advanced tab within this view contains a control to set the Feature Level of the UI. This is set to Production by default. You can enable additional features by setting this to Beta, with the aforementioned caveats in mind. Once this is set, a Beta badge will appear on the Cryostat application titlebar. Additional features enabled by this setting, such as Dashboard cards, will be labelled with a similar badge to indicate the feature level. If you set the feature level back to Production then any Beta-level features will be hidden from the UI again. + " + %} +
    4. +
    diff --git a/version/4.1.0/guides/_subsections/configure-graphical-notifications.md b/version/4.1.0/guides/_subsections/configure-graphical-notifications.md new file mode 100644 index 00000000..6168e23b --- /dev/null +++ b/version/4.1.0/guides/_subsections/configure-graphical-notifications.md @@ -0,0 +1,27 @@ +## [Configure Graphical Notifications](#configure-graphical-notifications) +Actions such as starting/stopping/archiving `Recordings` and state changes such as `Recordings` stopping after a fixed duration +produce graphical notifications. These notifications appear both when an interactive user performs the action via the +**web-client**, as well as when an [`Automated Rule`](#create-an-automated-rule) performs the action, or when any other API +client performs the action. If many `Automated Rules` or other API clients are active, the notification stream within +the **web-client** graphical console can become quite noisy. + +
      +
    1. + {% include_relative _subsections/common/navigate-to-settings.md %} +
    2. +
    3. + {% include howto_step.html + summary="Locate the Notifications Setting" + image-name="4.0.0/notifications-setting.png" + text=" + The Notifications setting within this view is used to control the graphical display of notifications that + correspond to WebSocket messages sent by the Cryostat backend when actions and state changes occur. The setting + contains a toggle switch for each category of notification, as well as a global switch All Notifications , to enable/disable all + categories at once. Disabling a notification category only prevents it from appearing as a pop-up notification + toast in the current web-client instance. The notification will still appear in the notification drawer, accessed + by clicking the bell icon in the application masthead, and other web-client instances or API clients will still + receive the notification to process as they will. + " + %} +
    4. +
    diff --git a/version/4.1.0/guides/_subsections/create-a-custom-target.md b/version/4.1.0/guides/_subsections/create-a-custom-target.md new file mode 100644 index 00000000..c5bd1345 --- /dev/null +++ b/version/4.1.0/guides/_subsections/create-a-custom-target.md @@ -0,0 +1,110 @@ +## [Create a Custom Target](#create-a-custom-target) + +**Cryostat** automatically discovers `target` **JVMs** using various mechanisms +(e.g. **Kubernetes API**, **JDP**, [Cryostat Agent plugin](#using-the-cryostat-agent)). +However, in some cases it may not be feasible or desirable to configure your +application to suit **Cryostat**'s discovery requirements. In these scenarios +you can tell **Cryostat** about them by filling out the *Custom Target* form to +specify *Custom Targets*. This can also be used to have **Cryostat** register +itself as a discovered target by using the special value `localhost:0`, which +informs **Cryostat**'s **JVM** to use a special **JMX** connection to itself +without going through the network stack. + +
      +
    1. + {% include_relative _subsections/common/navigate-to-topology.md %} +
    2. +
    3. + {% capture open-custom-target-form-text %} +

      + Search for Custom Target tab and click Create to open the + Custom Target form. +

      + + + +
      + Use the Custom Target form to tell Cryostat about JVM + applications that are not automatically discovered. +
      +
      +

      + {% endcapture %} + {% include howto_step.html + summary="Open the Custom Target Form" + image-name="4.0.0/topology-7.png" + caption="Click on Catalog Icon to open the Topology Entity Catalog." + text=open-custom-target-form-text + %} +
    4. +
    5. + {% include howto_step.html + summary="Enter Custom Target Definition" + image-name="4.0.0/custom-target-2.png" + caption="Use the form to enter the Custom Target definition." + text=" + The Connection URL is required for Cryostat to attempt to + find the target. You can optionally provide an Alias or + JMX credentials if the target has JMX authentication enabled. + " + %} +
    6. +
    7. + {% capture test-custom-target-text %} +

      + Once you enter a valid Connection URL, click on the sample node to test + the target connection. +

      + + + +
      + An exclamation mark and an alert banner will show if an error + occurs while connecting to the target. This may + occur if the URL is incorrect due to incorrect hostname or + port number, or if the port is blocked by a firewall or network + policy, or if the JVM listening on the specified port requires + JMX credentials that Cryostat does not have in its keyring, or + if the JVM listening on the specified port presents an SSL/TLS + certificate which Cryostat does not trust. Cryostat will also + refuse to add new Custom Target definitions for targets that it + has already discovered by other means. +
      +
      +

      + {% endcapture %} + {% include howto_step.html + summary="Test the Custom Target Definition" + image-name="4.0.0/custom-target-3.png" + caption="A ✅ checkmark will show if Cryostat can connect to the sample app." + text=test-custom-target-text + %} +
    8. +
    9. + Click Create Button to Generate a New Custom Target + definition once the test is successful. +
    10. +
    11. + {% include howto_step.html + summary="View the Custom Targets" + image-name="4.0.0/custom-target-5.png" + caption="The Custom Target will be available under Custom Targets realm." + text=" + Once the Custom Target form is successfully submitted, you + will be redirected to the Topology View. Here, you can view your + target under Custom Targets realm. + " + %} +
    12. +
    13. + {% include howto_step.html + summary="(Optional) Delete Custom Targets" + image-name="4.0.0/custom-target-6.png" + caption="Custom Targets can be cleaned up with Actions menu." + text=" + If the Custom Targets is no longer needed, in the target detail + panel, click the Actions menu and select Delete Target. + " + %} +
    14. +
    diff --git a/version/4.1.0/guides/_subsections/create-an-automated-rule.md b/version/4.1.0/guides/_subsections/create-an-automated-rule.md new file mode 100644 index 00000000..277ebf38 --- /dev/null +++ b/version/4.1.0/guides/_subsections/create-an-automated-rule.md @@ -0,0 +1,225 @@ +## [Create an Automated Rule](#create-an-automated-rule) + +`Automated Rules` are configurations that instruct **Cryostat** to create **JDK** `Flight Recordings` on matching +`target` **JVM** applications. Each `Automated Rule` specifies parameters for which *Event Template* to use, how +much data should be kept in the application recording buffer, and how frequently **Cryostat** should copy the +application recording buffer into **Cryostat's** own archived storage. + +Once you've created a rule, **Cryostat** immediately matches it against all existing discovered `targets` and starts your `Flight Recording`. **Cryostat** will also apply the rule to newly discovered `targets` that match its definition. You can create multiple rules to match different subsets of `targets` or to layer different recording options for your needs. + +We'll walk through two use cases: `Continuous` monitoring in a containerized **JVM**, and `Custom` monitoring with **Kubernetes** labels or annotations. + +### [Continuous Monitoring in a Containerized JVM](#continuous-monitoring-in-a-containerized-jvm) + +Previously, if we wanted to enable always-on `Continuous` monitoring using **JDK** Flight Recorder **(JFR)** in a containerized Java virtual machine **(JVM)**, we would set **JVM** flags on the `target` application, then restart the application to start monitoring. With **Cryostat's** `Automated Rules`, we can enable **JDK** Flight Recorder **(JFR)** at runtime to continuously monitor an already-running `target` application, with no restart, no redeploy, and no downtime. + +
      +
    1. + {% include howto_step.html + summary="Navigate to the Automated Rules Tab" + image-name="4.0.0/create-an-automated-rule-1.png" + caption="Switch to the Automated Rules tab." + %} +
    2. +
    3. + Click the Create Button +
    4. +
    5. + {% include howto_step.html + summary="Configure the new Automated Rule" + image-name="4.0.0/create-an-automated-rule-2.png" + text=" +

      + Name: Enter a name for the new rule. The form will alert you if the name + entered has an invalid format. If the name is already in use then the + creation will fail and you will need to try again. +

      +

      + Description: Enter an optional description for your rule. +

      +

      + Match Expression: We will fill this field in the next step. +

      +

      + Enabled: Enable or disable the rule. If disabled, the rule will not be applied to any targets. +

      +

      + Template: Select an Event Template or enter a custom event definition. If you are + unsure which to choose, the Continuous template is useful for + always-on production monitoring with the Continuous recording + duration setting, and the Profiling template is useful for + collecting extra information for troubleshooting a specifically + identified problem with a fixed recording duration. +

      + " + %} +
    6. +
    7. +
      + Create your Match Expression +

      + The Match Expression in a rule definition is a Common Expression Language expression that Cryostat interprets and uses to determine if a rule should be applied to any given target. Match Expressions should thus evaluate to a boolean value. The simplest Match Expressions would be the booleans true or false; if we use true, the rule will apply to every target. The Expression has a target object in global scope, with the following form in JSON notation: +

      +
      +{% highlight json %} +{ + "jvmId": "abcd1234", + "alias": "myAppAlias", + "connectUrl": "service:jmx:rmi:///jndi/rmi://cryostat:9091/jmxrmi", + "labels": { + "com.example/service": "customer-login", + }, + "annotations": { + "platform": { + "io.kubernetes/annotation": "annotated" + }, + "cryostat": { + "PORT": 9091, + "HOST": "cryostat", + "NAMESPACE": "myproject" + } + } +} +{% endhighlight %} +
      + The following functions are also available in the Expression execution context: +
      +{% highlight typescript %} +/** +* @param target the target context object +* @returns a list of JFR Event Type IDs +*/ +jfrEventTypeIds(target: Target): string[] +{% endhighlight %} +
      + See also: + +

      + The alias, connectUrl, labels, annotations.platform, and annotations.cryostat properties are all guaranteed to be present on the target object. alias and connectUrl will be non-empty strings. The jvmId is a hash string computed by Cryostat after it successfully connects to a target JVM and is used to uniquely identify that JVM instance - it will be empty if Cryostat has not yet connected to that target (for example, if its SSL/TLS certificate is not trusted or if Cryostat is missing the required credentials) The labels and platform annotations may be empty — in OpenShift or Kubernetes, these are populated from the labels and annotations applied to the target’s pod, if any. The Cryostat annotations map will vary per platform, but on OpenShift or Kubernetes you can expect the HOST, PORT, NAMESPACE, and POD_NAME keys to be present and non-empty. Take care to use the has or in operators when dealing with the labels and annotations map structures where specific keys may not exist. +

      +

      + The Expression also has a jfrEventTypeIds function in global scope, which takes the target object as a parameter and returns a list of strings corresponding to the Flight Recorder Event Types registered in the target JVM. +

      +
      +{% highlight typescript %} +jfrEventTypeIds(target: Target): string[]; +{% endhighlight %} +
      +

      + Here are some examples of Match Expressions: +

      +
      + +{% highlight bash %} +target.alias == 'com.example.MainClass' + +target.alias == 'myAlias' + +'com.example/service' in target.labels && target.labels[‘com.example/service’] == 'customer-login' + +'com.example/service' in target.labels && target.labels[‘com.example/service’] != 'customer-login' + +has(target.annotations.cryostat.PORT) && target.annotations.cryostat.PORT > 3000 + +has(target.annotations.cryostat.PORT) && 'io.kubernetes/annotation' in target.annotations.platform && target.annotations.cryostat.PORT > 3000 && target.annotations.platform['io.kubernetes/annotation'] == 'enabled' + +!('io.kubernetes/annotation' in target.annotations.platform) + +target.alias.matches("^customer-login[0-9]\*$") + +jfrEventTypeIds(target).exists(t, t.startsWith('myorg.myapp.')) +{% endhighlight %} + +
      +
      + +
    8. +
    9. + {% include howto_step.html + summary="Check your Match Expression" + image-name="4.0.0/create-an-automated-rule-3.png" + caption="You can select a target JVM to view its properties and use them to build your Match Expression." + text=" +

      + When you enter a Match Expression in the Match Expression field, the Match Expression Visualizer will highlight which targets are matched. +

      + " + %} +
    10. +
    11. + {% include howto_step.html + summary="(Optional) Adjust Rule Parameters" + image-name="4.0.0/create-an-automated-rule-4.png" + caption=" + Optionally set the Recording Options and Rule Parameters." + text=" +

      Maximum Size: The maximum size of Recording data retained in the target application's recording buffer. Values less than 1 indicate no limit.

      +

      Maximum Age: The maximum age of Recording data retained in the target application's recording buffer. Values less than 1 indicate no limit.

      +

      Archival Period: Time between copies of Active recording data being pulled into Cryostat archive storage. + Values less than 1 prevent data from being copied into archives - Recordings will be started and remain only in target JVM memory.

      +

      Initial Delay: Time between rule creation and when the first archived copy should be transferred. Values less than 1 are treated as being equal to the Archival Period above.

      +

      Preserved Archives: The number of Recording copies to preserve in archives for each target application affected by this rule. Values less than 1 prevent data from being copied into archives - Recordings will be started and remain only in target JVM memory.

      + +

      In the example image, the Maximum Recording age was set to 300 seconds and the Archival Period was set to a slightly shorter time period of 285 seconds. This overlap ensures that all of your Flight Recorder data is preserved in Cryostat's archives. The initial delay is set to 60 seconds however, so the first archive copy will be made 1 minute after the rule is created. The next copy will be made 5 minutes after that, the next another 5 minute later, etc.

      + " + %} + +
    12. +
    13. + Click the Create Button +
    14. +
    15. + {% include howto_step.html + summary="Observe the new Rule in the Automated Rules Table" + image-name="4.0.0/create-an-automated-rule-5.png" + caption=" + The new rule will appear in the Automated Rules table." + %} +
    16. +
    17. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    18. +
    19. + {% include howto_step.html + summary="Observe the automatically generated Recording in the Active Recordings Table" + image-name="4.0.0/create-an-automated-rule-6.png" + caption=" + Switch to the Recordings tab and view the new Recording in the Active Recordings + table." + text="Once you've set up your Automated Rules, Cryostat will continuously monitor applications that meet the criteria defined in those rules, with no need to restart or redeploy those applications." + %} +
    20. +
    + +### [Custom Monitoring with Kubernetes Labels or Annotations](#custom-monitoring-with-kubernetes-labels-or-annotations) + +We can define a rule that applies to any `target` application that has platform-specific attributes, such as **Kubernetes** labels or annotations. Here's an example in `JSON` notation: + +
    +{% highlight json %} + +{ + "name": "k8sMonitoring", + "description": "Enable the Demo template on any target with the jfrMonitoring=true annotation", + "matchExpression": "'jfrMonitoring' in target.annotations.platform && target.annotations.platform['jfrMonitoring']=='enabled'", + "eventSpecifier": "template=Demo,type=CUSTOM", + "archivalPeriodSeconds": 300, + "preservedArchives": 12 +} + +{% endhighlight %} + +
    + To create this rule with the Cryostat UI, follow the guide in Continuous Monitoring in a Containerized JVM. +
    +
    + +Once we've created this rule definition, **Cryostat** will check all of the existing `target` applications and watch for new `targets` that appear with the `jfrMonitoring=enabled` annotation. Any matching `targets` found will have a `Recording` started automatically using the *Custom Demo* template from our first use case. It will take an `Archived snapshot` every five minutes and maintain an hour’s worth of these archives in storage. + +With this rule definition in place, **Kubernetes** or **Red Hat OpenShift** users can use familiar tools like `kubectl/oc` or the `OpenShift console` to mark `target` applications for monitoring, without needing to interact directly with the **Cryostat** API or UI. This opens the door to further automating your workflow. + +As an example, you might use or implement an `Operator` that monitors traffic flow or pod restarts and enables monitoring on pods after some criterion threshold is met, then disables it again if the `target` application's behavior returns to normal. As a **Kubernetes** administrator, you could receive a notification when this occurs and check the **Cryostat** archives to retrieve JDK Flight Recorder data from the `target` application recorded during the problematic period, or you could view these `Archived Recordings` in **Cryostat’s Grafana** dashboard. + +**Note**: An important caveat is that **Cryostat** does not watch for changes in the **Kubernetes** annotations or labels; it only watches to see if `target` applications appear or disappear. To apply the annotation to a `target` application, we must apply the annotation or label to the application *pod* (which will cause **Kubernetes** to roll out a new replica), and not to the deployment. diff --git a/version/4.1.0/guides/_subsections/download-an-active-or-archived-recording.md b/version/4.1.0/guides/_subsections/download-an-active-or-archived-recording.md new file mode 100644 index 00000000..dfe6cccc --- /dev/null +++ b/version/4.1.0/guides/_subsections/download-an-active-or-archived-recording.md @@ -0,0 +1,49 @@ +## [Download an Active or Archived Recording](#download-an-active-or-archived-recording) +**Cryostat** provides some basic capabilities for analysis of **Flight Recording** data +in-cluster. However, the core analysis workflow is to collect **JFR** files from +`target` applications and copy them to local developer or admin workstations, then +use tools such as [`JDK Mission Control`](https://github.com/openjdk/jmc), +[`Visual VM`](https://visualvm.github.io/), [`binjr`](https://github.com/binjr/binjr), +or [`jfr`](https://dev.java/learn/jvm/jfr/tools/) for the heavy lifting on your workstation. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md %} +
    2. +
    3. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    4. +
    5. + {% include_relative _subsections/common/select-a-recording.md + select-a-recording-caption=" + Determine the Recording you wish to download to your local workstation. + This may be either an Active or Archived Recording. + Select the appropriate tab in the Recordings view. No actual action + needs to be taken at this step. + " + %} +
    6. +
    7. + {% include howto_step.html + summary="Download the Recording" + image-name="4.0.0/download-an-active-or-archived-recording-1.png" + caption=" + Click the action overflow \"︙\" three-dot menu on the right side of the + recording entry in the table, then click Download Recording. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="Choose what to do with the Recording File" + image-name="4.0.0/download-an-active-or-archived-recording-2.png" + caption=" + Your browser will present you with its standard file-save dialog for both + the Archived Recording, and a .metadata.json file containing any + Metadata Labels that were attached. It may take some time for these dialogs + to appear. Once it does, you can choose to open the Recording file directly + in an analysis tool, or to save the Recording to disk for later analysis. + " + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/download-an-automated-rule.md b/version/4.1.0/guides/_subsections/download-an-automated-rule.md new file mode 100644 index 00000000..8e552893 --- /dev/null +++ b/version/4.1.0/guides/_subsections/download-an-automated-rule.md @@ -0,0 +1,17 @@ +## [Download an Automated Rule](#download-an-automated-rule) + +`Automated Rules` can easily be downloaded for viewing and editing. + + +
      +
    1. + {% include howto_step.html + summary="Open Action Menu for a selected Rule" + image-name="4.0.0/download-an-automated-rule-1.png" + caption="Click the action overflow \"︙\" three-dot menu on the right side of selected rule entry in the table." + %} +
    2. +
    3. + Click Download Button to Download. +
    4. +
    diff --git a/version/4.1.0/guides/_subsections/download-edit-and-upload-a-customized-event-template.md b/version/4.1.0/guides/_subsections/download-edit-and-upload-a-customized-event-template.md new file mode 100644 index 00000000..546a99d5 --- /dev/null +++ b/version/4.1.0/guides/_subsections/download-edit-and-upload-a-customized-event-template.md @@ -0,0 +1,144 @@ +## [Download, Edit, and Upload a Customized Event Template](#download-edit-and-upload-a-customized-event-template) +Most **JVMs** will come with at least two **JFR** *Event Templates* definitions included: +the `Continuous` and `Profiling` templates. + +The `Continuous` template: +- has very low runtime overhead +- collects basic data +- is intended to be left on at all times, even in production + +The `Profiling` template: +- may have some detectable runtime overhead +- collects more in-depth data +- should be used for a fixed duration when a specific problem is discovered at runtime + +These two definitions will fit many monitoring and profiling workflows, but not +all. It may be useful to use either of these as a starting point and tailor it +to meet your specific monitoring/profiling needs by including/excluding events, +increasing/decreasing sample rates, raising/lowering thresholds, etc. + +Of special note, **JFR** allows for the definition of application-specific or +framework-level custom events, which would not be captured in either of the default +templates above. You can [view all of the **JFR** *Event Types*](#view-jfr-event-types) +for a *Target* application. + +**Cryostat** also provides the ALL meta-template, which enables all +event types in the selected `target` application, with default values for each +event option. This is not a true *Event Template* and does not have an `XML` +definition to download. + +Finally, **Cryostat** also includes some *Preset Event Templates*. These behave like +*Custom Event Templates* in that the event definition is stored by **Cryostat**, rather +than the `target` application, but are handled separately can cannot be deleted +like *Custom Event Templates*. *Preset Event Templates* can only be added to a **Cryostat** +instance by adding files to a specific configuration directory and restarting **Cryostat**. + +The steps below assume that you have at least one *Target* discovered. If you select +a discovered *Target* then you can use its templates as starting points for your +customizations. If you do not first select a *Target* then you may still upload and +delete **Custom Event Templates**. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md + select-target-application-additional-content=" + The Target selected will provide the base Continuous and + Profiling template definitions to start from. Most target + applications will be interchangeable here. + " + %} +
    2. +
    3. + {% capture navigate-to-events-include-text %} +

      + If the Target JVM has SSL/TLS enabled on JMX connections then it may be + necessary to add the Target's certificate to Cryostat's trust store. Go + to Add a Trusted Certificate + and return to this section after completing that guide. + + + +

      + {% endcapture %} + {% include howto_step.html + summary="Navigate to Events" + image-name="4.0.0/navigate-to-events-1.png" + caption=" + Supply JMX credentials to authenticate to the target, if necessary. If + the target is not configured with JMX authentication then the + connection attempt will continue without prompting for credentials. + " + text=navigate-to-events-include-text + %} +
    4. +
    5. + {% include howto_step.html + summary="Download the Template" + image-name="4.0.0/download-edit-and-upload-a-customized-event-template-1.png" + caption=" + Click the action overflow \"︙\" three-dot menu on the right side of the + template entry in the table, then click Download. + " + %} +
    6. +
    7. + {% capture edit-template-additional-content %} + The Template definition is an XML file, so you may open and edit it + with your favourite text editor or XML document editor. The JMC + Template Manager can also be used for this purpose, as described in + + Edit Template With JMC + . + {% endcapture %} + {% include howto_step.html + summary="Edit the Template" + image-name="4.0.0/download-edit-and-upload-a-customized-event-template-2.png" + caption=edit-template-additional-content + text=" + Edit the Template definition to suit your requirements. When you are + satisfied with the new configuration, give your new Template a + meaningful and recognizable tag by editing the + <configuration> element at the top of the file and + setting the label= attribute to the desired name. You + should also save the file according to this new name, but this is not + strictly necessary. The description and + provider attributes can also be used to help identify this + Template later and to explain its goals and purpose. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="Open the Template Upload Dialog" + image-name="4.0.0/download-edit-and-upload-a-customized-event-template-3.png" + caption=" + Back on the Cryostat Events View, click the Upload Icon + in the table toolbar. A dialog will appear. + " + %} +
    10. +
    11. + {% include howto_step.html + summary="Upload the Template" + image-name="4.0.0/download-edit-and-upload-a-customized-event-template-4.png" + caption=" + Click the Browse button. Your browser will present its + native file chooser dialog to select the file to upload. Browse and + select the Template file, then click + OK/Select/Continue/Open. Click Submit on the + Cryostat dialog. + " + %} +
    12. +
    13. + {% include howto_step.html + summary="Observe the new Template" + image-name="4.0.0/download-edit-and-upload-a-customized-event-template-5.png" + caption=" + Once the Template has been uploaded you will be returned to the + Events View, and your template will be present in the + table. + " + %} +
    14. +
    diff --git a/version/4.1.0/guides/_subsections/edit-template-with-jmc.md b/version/4.1.0/guides/_subsections/edit-template-with-jmc.md new file mode 100644 index 00000000..d03c12ce --- /dev/null +++ b/version/4.1.0/guides/_subsections/edit-template-with-jmc.md @@ -0,0 +1,86 @@ +## [Edit Template With JMC](#edit-template-with-jmc) +[JDK Mission Control](https://github.com/openjdk/jmc) has a *Template Manager* +functionality which also contains a graphical wizard for editing `.jfc` *Event +Template* files. This may be preferred to editing the templates directly as `XML` +plaintext or using `XML` document editors, which do not have `.jfc`-specific `XSD` +validation or any hinting for event types and options. + +
      +
    1. + {% capture acquire-template-additional-context %} + If you do not have an event template definition then you can visit + + Download, Edit, and Upload a Customized Event Template + + and follow the first few steps to retrieve one from a remote target + application accessible by Cryostat. Otherwise, if you have the JDK + installed locally, you can find templates at + $JAVA_HOME/lib/jfr. + {% endcapture %} + {% include howto_step.html + summary="Acquire an Event Template" + image-name="4.0.0/edit-template-with-jmc-1.png" + caption=" + Ensure that you have an event template definition .jfc file + somewhere on your local workstation, with read/write permissions. + " + text=acquire-template-additional-context + %} +
    2. +
    3. + {% include howto_step.html + summary="Launch JDK Mission Control" + image-name="4.0.0/edit-template-with-jmc-2.png" + caption="The main JMC window after launch" + %} +
    4. +
    5. + {% include howto_step.html + summary="Open the Template Manager" + image-name="4.0.0/edit-template-with-jmc-3.png" + caption="Select Window > Flight Recording Template Manager" + %} +
    6. +
    7. + {% include howto_step.html + summary="Import the Base Template" + image-name="4.0.0/edit-template-with-jmc-4.png" + caption=" + Click Import Files..., then browse to and select the + Template from Step 1. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="Edit the Template" + image-name="4.0.0/edit-template-with-jmc-5.png" + caption=" + Select the imported Template, then click Edit and make your + desired changes. Before making changes you may also click + Duplicate to create an identical copy of the Template as a base + to iterate upon. + " + %} +
    10. +
    11. + {% capture use-edited-template-additional-content %} + Once your edited Template is saved to a file on your local workstation + it can be used when starting new Flight Recordings. To do this using + Cryostat, see + Download, Edit, and Upload a Customized Event Template + for instructions on how to upload the new template to Cryostat and + Start/Stop a Recording + for instructions on how to create a new Recording using this Template. + {% endcapture %} + {% include howto_step.html + summary="Export the Template" + image-name="4.0.0/edit-template-with-jmc-6.png" + caption=" + Click Export File... to save the event template to a .jfc + file on your local workstation. + " + text=use-edited-template-additional-content + %} +
    12. +
    diff --git a/version/4.1.0/guides/_subsections/getting-help.md b/version/4.1.0/guides/_subsections/getting-help.md new file mode 100644 index 00000000..38904f9a --- /dev/null +++ b/version/4.1.0/guides/_subsections/getting-help.md @@ -0,0 +1,60 @@ +## [Getting Help](#getting-help) + +The **Cryostat** web application contains online help resources that you can use to learn more about +how to use **Cryostat** directly within its interface. + +### [Welcome Tour](#welcome-tour) + +The *Welcome Tour* is a first-run introduction to **Cryostat** that you will see the first time you log in. +If you clear your browser's local storage, use a private browsing window, or use a different browser, you will see the *Tour* again. + +{% include howto_step.html + summary="Welcome Tour" + image-name="4.0.0/welcome-tour.png" + caption="Click through the Welcome Tour to learn how to use Cryostat." + text="The Welcome Tour provides an introduction to Cryostat's layout and indicates where further tutorials and help can be found." +%} + +If you have completed the tour previously, feel free to click Skip Tour and dive right in to **Cryostat**. +If you have not completed the tour previously and are unsure what **Cryostat** can do or how to use it, click Get Started +to begin the guided walkthrough of the **Cryostat Web** application. + +{% include howto_step.html + summary="Tour Begins" + image-name="4.0.0/guided-tour.png" + caption="Click Next through the Welcome Tour to learn how to use **Cryostat**." + text="Continue through the tour to learn how the UI is organized and where you can find additional help." +%} + +#### [Return to the Tour](#return-to-the-tour) + +You can return to the tour and revisit its contents at any time. + +Whenever you feel the need to return to the tour and revisit its contents, simply click the `?` Help icon in the +application masthead, then click Guided tour in the dropdown menu that appears. + +{% include howto_step.html + summary="Open Help Menu" + image-name="4.0.0/masthead-help.png" + caption="The ? Help menu on the application masthead contains additional resources." + text="Click Guided tour to relaunch the same tour." +%} + +### [Quick Starts](#quickstarts) + +**Cryostat** also includes some *Quick Start* online tutorials to guide you through some common tasks. These are more in-depth +and will directly guide you through the UI as you complete them by operating on your own real applications. + +{% include howto_step.html + summary="Open Help Menu" + image-name="4.0.0/masthead-help.png" + caption="The ? Help menu on the application masthead contains additional resources." + text="Click Quick Starts to view the tutorial catalog." +%} + +{% include howto_step.html + summary="View the Quick Start Catalog" + image-name="4.0.0/quick-start-catalog.png" + caption="The Quick Start catalog contains a series of tutorials you can follow to learn how to accomplish specific tasks." + text="Select and complete the tutorials which interest you. You can revisit this catalog at any time and re-do tutorials as many times as you like." +%} diff --git a/version/4.1.0/guides/_subsections/navigate-the-dashboard.md b/version/4.1.0/guides/_subsections/navigate-the-dashboard.md new file mode 100644 index 00000000..6959a916 --- /dev/null +++ b/version/4.1.0/guides/_subsections/navigate-the-dashboard.md @@ -0,0 +1,530 @@ +## [Navigate the Dashboard](#navigate-the-dashboard) +The *Dashboard* is the first view you will see when you log into **Cryostat**. It provides a high-level overview of the state of your **Cryostat** instance and the `target` **JVM** applications it is monitoring. + +{% include_relative _subsections/common/navigate-to-dashboard.md %} + +### [Dashboard Cards](#dashboard-cards) + +`Dashboard cards` are widgets that display information about your **Cryostat** instance and the `target` **JVM** applications it is monitoring, or allow you to perform diagnostic actions against the `targets`. Let's walk through the available `cards` and how to add them to your *Dashboard*. + +{% include_relative _subsections/common/card-catalog.md %} + +#### [Target JVM Details Card](#target-jvm-details-card) + +
      +
    1. + {% capture target-jvm-details-text %} + The Target JVM Details card displays information about the target JVM application that is currently selected. There are two tabs that display different information: +
        +
      • + Details Tab - Displays information about the target JVM application, including: +
          +
        1. + Connection URL - The JMX connection URL of the target JVM application. +
        2. +
        3. + Alias - The alias of the target JVM application. +
        4. +
        5. + JVM ID - The JVM ID of the target JVM application. +
        6. +
        7. + Labels - The labels of the target JVM application. +
        8. +
        9. + Annotations - The annotations of the target JVM application. +
        10. + and more... +
        +
      • +
      • + Resources Tab - Displays the resources associated with the target JVM application. There are two tables: + +
      • +
      + {% endcapture %} + {% include howto_step.html + summary="Add the Target JVM Details Card" + image-name="4.0.0/dashboard/targetjvmdetails-preview.png" + caption=" + Click on the Target JVM Details card for a preview. + " + text=target-jvm-details-text + %} +
    2. +
    3. +
      + Finish Card Creation + There are no extra steps in the creation wizard for this card. Click Finish to add the card to your dashboard. +
      +
      + + Details tab + +
      Details Tab
      +
      +
      + + Resources tab + +
      Resources Tab
      +
      +
      +
      +
    4. +
    + +#### [Automated Analysis Card](#automated-analysis-card) + +
      +
    1. + {% capture automated-analysis-text %} +

      + The Automated Analysis card allows users to view JMC Automated Analysis reports in a nicely formatted dashboard card. The card allows the user to create a special Recording, and then automatically generates an Automated Analysis report. The report displays potential problems with your JVM, and provides suggestions on how to improve the performance and security of your selected JVM application. The card also contains a toolbar that allows you to refresh the report, delete the report, filter results, and change the view. +

      +

      Gallery view

      +
      + + Gallery view + +
      +

      + The Gallery view of the Automated Analysis Card displays a Result, a report summary, for each Rule that was triggered in the selected Recording. In this view, each Rule is listed in categories based on the event type. For example, the Thrown Errors and the Thrown Exceptions Rules are part of the exceptions category, as seen in the figure above. By clicking on each Rule, you can view more details about the Rule and the Result that was generated. +

      +
      + + Automated Analysis Result + +
      + The Discouraged Management Agent Settings Rule result with a severity score of 25.0. + A Summary, Explanation, and Solution can be seen in the Result. +
      +
      +

      + A Result has a severity score from 0 (no problem) to 100 (potentially severe problem). +

      +

      + The Result will also show three text details, if applicable: +

        +
      • + Summary: A short summary of the problem. +
      • +
      • + Explanation: A detailed explanation of the problem. +
      • +
      • + Solution: A suggested solution to the problem. +
      • +
      +

      +

      List View

      +
      + + List view + +
      +

      + The List view of the Automated Analysis Card displays each Result in a listed table. The table can be sorted by clicking on the column headers. The Result will also show the Summary, Explanation, and Solution in the Description column. +

      +

      Toolbar

      + The Toolbar allows you to filter results, change the view, refresh the report, and delete the report. + + You are able to filter: +
        +
      1. + By severity: You can filter by severity score by dragging the score slider or typing a score in the score input. The Result table will only show results with the score greater or equal to the selected filter score. Additionally, if there are Critical or Warning results, click the corresponding labels in the card header to only show those Results. Reset the filter by clicking on the buttons next to the Reset text (i.e the `0`). +
      2. +
      3. + By category: You can filter by Rule Name or Topic by clicking on the Name filter dropdown. Then select a filtered item by clicking the Dropdown next to it. You may also type in this Dropdown to search for a specific item. The Result table will only show results that match the selected filter. +
      4. +
      + {% endcapture %} + {% include howto_step.html + summary="Add the Automated Analysis Card" + image-name="4.0.0/dashboard/automatedanalysis-preview.png" + caption=" + Click on the Automated Analysis card for a preview. + " + text=automated-analysis-text + %} +
    2. +
    3. + {% capture configure-automated-analysis %} +

      + In the next steps of the card creation, you can optionally provide Advanced Configuration. You can configure the settings of the special Recording that is used to generate the report. The Current Configuration will be shown and can be edited by clicking the Pencil icon. By default, the Recording uses a Continuous template, a Maximum size of 10MB, and a 0 second Maximum age (meaning an unlimited recording duration). +

      +

      + Note: It is possible that setting both an infinite maximum size and age will result in an Out Of Memory error during report generation. +

      + {% endcapture %} + {% include howto_step.html + summary="Configure the Automated Analysis Card" + image-name="4.0.0/dashboard/automatedanalysis-configuration.png" + caption="Click Next to optionally provide Advanced Configuration." + text=configure-automated-analysis + %} +
    4. +
    5. + {% include howto_step.html + summary="Finish Card Creation" + image-name="4.0.0/dashboard/automatedanalysis-errorview.png" + caption="The card will be added to the dashboard with an error view." + text="After clicking Finish, the card will be added to the dashboard with an error view. This is because the card has not yet detected a special Automated Analysis Recording to source reports from." + %} +
    6. +
    7. + {% include howto_step.html + summary="Click Create Recording" + image-name="4.0.0/dashboard/automatedanalysis-success.png" + caption="The Automated Analysis card displayed with a successful report." + text="After clicking Create Recording, the card should be populated with report data containing the Results of the Automated Analysis report." + %} +
    8. +
    + +#### [MBean Metrics Chart Card](#mbean-metrics-chart-card) + +
      +
    1. + {% capture mbean-metrics-chart-text %} +

      + The MBean Metrics Chart card displays performance metrics about the target JVM through remote access to supported Java MXBeans interfaces of the JVM, including Thread, Runtime, OperatingSystem, and Memory MXBeans. +

      +

      + Cryostat gathers this data and displays them in various charts. You can customize each card by going through the card creation wizard. The wizard will guide you through the process of selecting the metrics you want to display, how you want to display them, and other various configuration options. Some examples of Performance Metrics that can be displayed are: +

      +
        +
      • Process CPU Load
      • +
      • System Load Average
      • +
      • Heap Memory Usage
      • +
      • ...
      • +
      + {% endcapture %} + {% include howto_step.html + summary="Add the MBean Metrics Chart Card" + image-name="4.0.0/dashboard/mbeanmetrics-preview.png" + caption="Click on the MBean Metrics Chart card for a preview." + text=mbean-metrics-chart-text + %} +
    2. +
    3. + {% capture configure-mbean-metrics-chart %} +

      + In the next steps of the card creation, you can configure the details of the chart card. +

      +

      + Configure the metric data by clicking the Performance Metric dropdown and selecting a metric. You can also configure the Data Window to display a specific time range of data, the Refresh Period to control how often the chart is updated, and the Color Theme to change the chart metric color. +

      + {% endcapture %} + {% include howto_step.html + summary="Configure the MBean Metrics Chart Card" + image-name="4.0.0/dashboard/mbeanmetrics-configuration.png" + caption="Click Next to provide card configuration." + text=configure-mbean-metrics-chart + %} +
    4. +
    5. + {% capture mbean-metrics-chart-finish %} +

      + After clicking Finish, the card will be added to the dashboard. You can click the refresh button "↻" on the top right of the card at any time to reload the metrics. +

      + {% endcapture %} + {% include howto_step.html + summary="Finish Card Creation" + image-name="4.0.0/dashboard/mbeanmetrics.png" + caption="The MBean Metrics Chart card displayed with the Process CPU Load metric." + text=mbean-metrics-chart-finish + %} +
    6. +
    + +#### [JFR Metrics Chart Card](#jfr-metrics-chart-card) + +
      +
    1. + {% capture jfr-metrics-chart-text %} +

      + The JFR Metrics Chart card displays performance metrics about the target JVM by visualizing JFR data snapshots via embedded Grafana visualization panels as Dashboard cards. This Beta-level feature. A significant limitation of this card is that it depends upon the stateful jfr-datasource backend component, which only converts one Flight Recording file at a time to Grafana data. Therefore, this card does not behave well if multiple web-client instances are open at the same time, whether used by one user or multiple human users. +

      +

      + Cryostat gathers typical JFR data from the selected Targetand periodically updates the Grafana visualizations. You can customize each card by going through the card creation wizard. The wizard will guide you through the process of selecting the metrics you want to display, how you want to display them, and other various configuration options. Some examples of Performance Metrics that can be displayed are: +

      +
        +
      • CPU Load
      • +
      • Memory Usage
      • +
      • Heap Usage
      • +
      • Network Utilization
      • +
      • File I/O
      • +
      • Exception Statistics
      • +
      • ...
      • +
      + {% endcapture %} + {% include howto_step.html + summary="Add the JFR Metrics Chart Card" + image-name="4.0.0/dashboard/jfrmetrics-preview.png" + caption="Click on the JFR Metrics Chart card. No preview is available." + text=jfr-metrics-chart-text + %} +
    2. +
    3. + {% capture jfr-mbean-metrics-chart %} +

      + In the next steps of the card creation, you can configure the details of the chart card. +

      +

      + Configure the metric data by clicking the Performance Metric dropdown and selecting a metric. You can also configure the Data Window to display a specific time range of data and the Refresh Period to control how often the chart is updated. +

      + {% endcapture %} + {% include howto_step.html + summary="Configure the JFR Metrics Chart Card" + image-name="4.0.0/dashboard/jfrmetrics-configuration.png" + caption="Click Next to provide card configuration." + text=jfr-mbean-metrics-chart + %} +
    4. +
    5. + {% capture jfr-metrics-chart-created %} +

      + After clicking Finish, the card will be added to the dashboard. Initially the card will have no source Recording and display no data. +

      + {% endcapture %} + {% include howto_step.html + summary="Finish Card Creation" + image-name="4.0.0/dashboard/jfrmetrics-no-source.png" + caption="The JFR Metrics Chart card created with no source recording." + text=jfr-metrics-chart-created + %} +
    6. +
    7. + {% capture jfr-metrics-chart-finish %} +

      + Click Create on the card to create a source Recording. Cryostat will walk you through creating the Recording. You can simply click through the form and accept the suggested default settings. This will begin a Flight Recording on the selected Target and send you to the Recordings view. Once you return to the Dashboard and the recording is available then Cryostat will begin to process and update the Recording to update the card visualization. +

      + {% endcapture %} + {% include howto_step.html + summary="Start source Flight Recording" + image-name="4.0.0/dashboard/jfrmetrics.png" + caption="The JFR Metrics Chart card displayed with the Memory Usage metric." + text=jfr-metrics-chart-finish + %} +
    8. +
    + +#### [Diagnostic Actions Card](#diagnostic-actions-card) + +
      +
    1. + {% capture diagnostics-card-text %} +

      + The Diagnostics card allows you to perform non-metrics diagnostic actions against the selected Target. This Beta-level feature +

      +

      + The following diagnostic actions are available: +

        +
      • Request JVM to perform Garbage Collection
      • +
      +

      + {% endcapture %} + {% include howto_step.html + summary="Add the Diagnostics Card" + image-name="4.0.0/dashboard/diagnostics-preview.png" + caption="Click on the Diagnostics card. No preview is available." + text=diagnostics-card-text + %} +
    2. +
    3. + {% capture diagnostics-card-created %} +

      + After clicking Finish, the card will be added to the dashboard. +

      + {% endcapture %} + {% include howto_step.html + summary="Finish Card Creation" + image-name="4.0.0/dashboard/diagnostics.png" + caption="The Diagnostics card." + text=diagnostics-card-created + %} +
    4. +
    + +### [Configuring the Dashboard](#configuring-the-dashboard) +The Dashboard is highly customizable and can be configured to display the cards you want to see. You can customize the layout of the cards on the dashboard by Moving, Resizing, and Removing cards. + +#### [Moving, Resizing, and Removing cards](#moving-and-resizing-cards) +
      +
    1. + {% include howto_step.html + summary="Add a Card to the Dashboard" + image-name="4.0.0/dashboard/targetjvmdetails-preview.png" + caption="Open the card catalog by clicking the Catalog icon on the Dashboard toolbar." + text="Let's add the Target JVM Details card." + %} +
    2. +
    3. + {% include howto_step.html + summary="Resize the Card" + image-name="4.0.0/dashboard/dashboard-resize.png" + caption="Click and drag the right edge of the card to resize it." + %} +
    4. +
    5. + {% include howto_step.html + summary="Add another Card to the Dashboard" + image-name="4.0.0/dashboard/mbeanmetrics-preview.png" + caption="Open the card catalog by clicking the Catalog icon on the Dashboard toolbar." + text="Let's add the MBean Metrics Chart card this time." + %} +
    6. +
    7. + {% include howto_step.html + summary="Rearrange Cards" + image-name="4.0.0/dashboard/dashboard-rearrange.png" + caption="Click and drag the Target JVM Details card's header on top or to the right of the MBeans Metrics Chart card to swap their positions." + %} +
    8. +
    9. + {% capture remove-card-text %} +

      + Each card header contains a kebab icon that opens a menu of card actions. The actions menu contains the following options: +

        +
      • + View - Opens the card in fullscreen mode. +
      • +
      • + Remove - Removes the card from the dashboard. +
      • +
      • + Reset Size - Resets the card to its default size. +
      • +
      +

      +
      + + {{ Removed card }} + +
      Click Remove to remove the card.
      +
      + {% endcapture %} + {% include howto_step.html + summary="Remove Cards" + image-name="4.0.0/dashboard/dashboard-cardkebab.png" + caption="Click the Kebab icon on the card header to open the card actions menu." + text=remove-card-text + %} +
    10. +
    + +### [Dashboard Layouts and Templates](#dashboard-layouts-and-templates) +*Dashboard Layouts* are a way to organize your dashboard `cards` into different views. You can create multiple layouts and switch between them to view different `cards`. Favorite, Rename, and Delete layouts to customize your dashboard. + +By default, the `Default` layout is created for you. This layout contains the cards three *MBean Metrics Chart* `cards`. You can modify this layout's `card` configuration, but you cannot *Rename* or *Delete* it. + +*Layout Templates* save your layouts for later use. You can *Create* a template from a layout, and then use that template to *Create* a new layout with the same `cards`. You can also *Import* and *Export* templates to share them with other **Cryostat** users. + +#### [Create a new Dashboard Layout](#create-a-new-dashboard-layout) +
      +
    1. + {% include_relative _subsections/common/layout-selector.md %} +
    2. +
    3. + {% include howto_step.html + summary="Click New Layout" + image-name="4.0.0/dashboard/dashboard-blanklayout.png" + text="Clicking New Layout will create a new blank layout and switch the dashboard view to the new layout. The layout should be called something like Custom1." + %} +
    4. +
    5. + {% include howto_step.html + summary="(Optional) Rename Layouts" + image-name="4.0.0/dashboard/dashboard-renamelayout.png" + caption="Click the Pencil button to rename the currently selected layout." + text="You are able to rename layouts by clicking the Pencil button next to the layout selector. This will rename the currently selected layout. You can also rename layouts within the layout selector dropdown itself." + %} +
    6. +
    7. + {% include howto_step.html + summary="(Optional) Delete Layouts" + image-name="4.0.0/dashboard/dashboard-deletelayout.png" + caption="Click 🗑️ Delete to delete the currently selected layout." + text="Deletion is similar to renaming. Click the trash can icon with the text Delete next to the layout selector to delete the currently selected layout. You can also delete layouts within the layout selector dropdown itself." + %} +
    8. +
    + +#### [Set a Layout as a Template](#set-a-layout-as-a-template) +
      +
    1. + {% include howto_step.html + summary="Save a layout as a template" + image-name="4.0.0/dashboard/dashboard-layout-setastemplate.png" + caption='Click more options "⋮" on the dashboard toolbar, then click Set as template to set the desired layout as a template.' + text="The layout template will be saved as a User-submitted template in the template picker." + %} +
    2. +
    + +#### [Create a new Dashboard Layout from a Template](#create-a-new-dashboard-layout-from-a-template) + +
      +
    1. + {% include_relative _subsections/common/layout-selector.md %} +
    2. +
    3. + {% include howto_step.html + summary="Select Choose Template" + image-name="4.0.0/dashboard/dashboard-layoutselector-options.png" + text="Click the expandable menu on New Layout button and select Choose Template. This will open the template picker." + %} +
    4. +
    5. + {% capture template-picker-guide-text %} +

      + The template picker displays all the available templates. Templates are categorized into 3 groups. +

        +
      1. + Suggested: Templates that are suggested for you based on recent activity. +
      2. +
      3. + Cryostat: Templates that come with Cryostat. +
      4. +
      5. + User-submitted: Templates that you have created or imported. +
      6. +
      +

      + Additionally, you can search for templates by typing in the Search bar or Filter templates by category. You can also upload templates directly here by clicking Upload. +

      +

      + Select a template by clicking on it. +

      +

      + {% endcapture %} + {% include howto_step.html + summary="Choose a Template" + image-name="4.0.0/dashboard/dashboard-templatepicker.png" + caption="Clicking a template will open a preview where you can view the template's cards." + text=template-picker-guide-text + %} +
    6. +
    7. + {% include howto_step.html + summary="Enter a Name for the New Layout" + image-name="4.0.0/dashboard/dashboard-templatepicker-name.png" + text="A layout name must be entered before the Create button is enabled. The name must be alphanumeric, can only contain underscores, dashes, and periods, and must be 20 characters or less." + %} +
    8. +
    9. + {% include howto_step.html + summary="Click Create" + image-name="4.0.0/dashboard/dashboard-layouttemplate.png" + caption="The new layout will be created and the dashboard view will switch to the new layout with the template applied." + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/perform-garbage-collection.md b/version/4.1.0/guides/_subsections/perform-garbage-collection.md new file mode 100644 index 00000000..eb0923a1 --- /dev/null +++ b/version/4.1.0/guides/_subsections/perform-garbage-collection.md @@ -0,0 +1,33 @@ +## [Perform Garbage Collection](#perform-garbage-collection) +
      +
    1. + {% capture perform-garbage-collection-text %} +

      + The Diagnostics card allows + you to perform diagnostic operations on a target JVM through remote access to supported Java MXBeans. +

      +

      + Currently Cryostat supports invoking garbage collection on target JVMs. +

      + {% endcapture %} + {% include howto_step.html + summary="Add the Diagnostics Card" + image-name="4.0.0/dashboard/add-diagnostics-card.png" + caption="Click on the Diagnostics card for a preview." + text=perform-garbage-collection-text + %} +
    2. +
    3. + {% capture diagnostics-card-finish %} +

      + After clicking Finish, the card will be added to the dashboard. You can click the Start Garbage Collection button in the middle of the card at any time to trigger a garbage collection cycle. +

      + {% endcapture %} + {% include howto_step.html + summary="Finish Card Creation" + image-name="4.0.0/dashboard/diagnostics-card.png" + caption="The Diagnostics card displayed on the dashboard." + text=diagnostics-card-finish + %} +
    4. +
    \ No newline at end of file diff --git a/version/4.1.0/guides/_subsections/re-upload-a-recording-to-archives.md b/version/4.1.0/guides/_subsections/re-upload-a-recording-to-archives.md new file mode 100644 index 00000000..1bfa0944 --- /dev/null +++ b/version/4.1.0/guides/_subsections/re-upload-a-recording-to-archives.md @@ -0,0 +1,52 @@ +## [Re-Upload a Recording to Archives](#re-upload-a-recording-to-archives) +After downloading an `Archived Recording` from **Cryostat**, it can be re-uploaded +into **Cryostat's** archives later. This is useful if, for example, your **Cryostat** +instance has been scaled down or undeployed for some time and the attached +storage is lost, and you then want to use **Cryostat's** analysis tools with a +previously retrieved Recording in a new **Cryostat** instance. + +
      +
    1. + {% include howto_step.html + summary="Navigate to the Archives Tab" + image-name="4.0.0/re-upload-a-recording-to-archives-1.png" + caption="Select the Uploads tab." + text="The entire Archives view contains several tabs related to performing operations + on Archived Recordings. See Viewing Archived Recordings. + " + %} +
    2. +
    3. + {% include howto_step.html + summary="Select the Recording to Upload" + image-name="4.0.0/re-upload-a-recording-to-archives-2.png" + caption=" + Click the Upload Icon to bring up the upload prompt. Then click Upload and select the + .jfr file to upload. Note that the file must follow the Cryostat Archive Recording + naming convention. Mouse over the [?] tooltip on the prompt for more information. + " + %} +
    4. +
    5. + {% include howto_step.html + summary="(Optional) Add Metadata Labels" + image-name="4.0.0/re-upload-a-recording-to-archives-3.png" + caption=" + Click Show metadata options to add optional Metadata Labels to a Recording. + You can either add Labels by clicking the Add Label button, or by uploading + a custom .json Labels file from your local storage. A custom Labels file + can be downloaded alongside downloading a Recording. To learn how to download a Recording + and any associated Labels, see Download an Active or Archived Recording. + and for more on Cryostat Metadata Labels, see Add and Edit Recording Metadata Labels. + " + %} +
    6. +
    7. + {% include howto_step.html + summary="Upload the Recording" + image-name="4.0.0/re-upload-a-recording-to-archives-4.png" + caption="Click Upload and observe that the Recording is now present in + the Uploads tab of the Archives view." + %} +
    8. +
    diff --git a/version/4.1.0/guides/_subsections/snapshot-a-recording.md b/version/4.1.0/guides/_subsections/snapshot-a-recording.md new file mode 100644 index 00000000..6aeba3f0 --- /dev/null +++ b/version/4.1.0/guides/_subsections/snapshot-a-recording.md @@ -0,0 +1,56 @@ +## [Snapshot a Recording](#snapshot-a-recording) +Snapshotting an application produces a new `Flight Recording` named `snapshot-n`, +where `n` is a natural number. This `snapshot` contains all of the **JFR** data that +was present in the target **JVM** at the time that the `snapshot` was taken and is in +the `STOPPED` state as soon as it is created (that is, the` snapshot` will never +record any further information and is fixed in size). This is useful when you +have an ongoing, `Continuous Recording` active in a target application and want +to preserve the specific information at a given point in time. If the +`Continuous` source `Recording` is configured with a maximum event age or maximum +recording size then the need for `snapshots` is more apparent, since without +snapshotting, some older data will eventually be dropped and lost from the +source `Recording`. It is also useful when you have multiple concurrent source +`Recordings` running and want an easy way to capture the sum of all of their data +at a given point in time. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md %} +
    2. +
    3. + {% capture navigate-recordings-additional-content %} +

      + If you do not have any Recordings present in the Active Recordings + view, follow + Start/Stop a Recording + to create one, or select a different target application. +

      + {% endcapture %} + {% include_relative _subsections/common/navigate-to-recordings.md additional-content=navigate-recordings-additional-content %} +
    4. +
    5. + {% include_relative _subsections/common/click-create.md %} +
    6. +
    7. + {% include howto_step.html + summary="Switch to the Snapshot Recording tab" + image-name="4.0.0/snapshot-a-recording-1.png" + caption=" + Switch to the Snapshot Recording Tab and Click the Create + button. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="Observe the New snapshot" + image-name="4.0.0/snapshot-a-recording-2.png" + caption=" + After clicking the Create button you will be returned to the + Active Recordings view and the new snapshot recording will be present + in the table. The snapshot recording can then be treated as any other + Active Recording in the target application's JVM memory. + " + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/startstop-a-recording.md b/version/4.1.0/guides/_subsections/startstop-a-recording.md new file mode 100644 index 00000000..2a254533 --- /dev/null +++ b/version/4.1.0/guides/_subsections/startstop-a-recording.md @@ -0,0 +1,115 @@ +## [Start/Stop a Recording](#startstop-a-recording) +The first and most basic workflow is to start a `Flight Recording` in a `target` +**JVM**. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md %} +
    2. +
    3. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    4. +
    5. + {% include_relative _subsections/common/click-create.md %} +
    6. +
    7. + {% include howto_step.html + summary="Configure the new Recording" + image-name="4.0.0/startstop-a-recording-1.png" + text=" +

      + Enter a Name for the new Recording. The form will alert you if the name + entered has an invalid format. If the name is already in use then the + creation will fail and you will need to try again, or check the Restart if recording already exists + checkbox to allow Cryostat to reuse the same recording name for a new recording with new settings. +

      +

      + Select the Duration of the Recording. The duration can be specified in + seconds, minutes, or hours. If you want to record indefinitely, select the + Continuous option. You may also want to save the Recording to Cryostat archive + storage when the Recording stops with the Archive on Stop option. +

      +

      + Select an event Template or enter a custom event definition. If you are + unsure which to choose, the Continuous template is useful for + always-on production monitoring with the Continuous recording + duration setting, and the Profiling template is useful for + collecting extra information for troubleshooting a specifically + identified problem with a fixed Recording duration. + You can also + upload a custom Event Template + and select it here. +

      +

      + To learn about Metadata Options, see Add and Edit Recording Metadata Labels. +

      + " + %} +
    8. +
    9. + {% include howto_step.html + summary="(Optional) Adjust any Advanced Options for the Recording" + image-name="4.0.0/startstop-a-recording-2.png" + text=" +

      + In many cases, the Advanced Options can be left with their + default values. To view and change their values, select Show + advanced options above the Create button. The following + options are configurable: +

      +

      + To Disk: Use this parameter to specify whether to write data to + your JVM container's disk while recording. By default, this parameter + is true. +

      +

      + Maximum Size: Use this parameter to specify the maximum size of + disk data to keep for the Recording. This parameter is valid only when + the disk parameter is set to true. By default, the maximum size of disk + data isn’t limited, and this parameter is set to 0. +

      +

      + Maximum Age: Use this parameter to specify the maximum number of + seconds, minutes, or hours that events should be kept in the Recording + before being discarded. This parameter is valid only when the disk + parameter is set to true, and the Recording duration is not Continuous. + By default, this parameter is set to 0, which means there is no limit set. +

      + " + %} +
    10. +
    11. + Click the Create button +
    12. +
    13. + {% capture stop-the-recording-additional-content %} +

      + When you no longer desire for the Flight Recording to be Active and + collecting data in your target application, select the Recording from + the list by clicking the checkbox to the left of the Recording name. + This will enable the Stop button in the toolbar. Click the + Stop button to end the data collection. +

      +

      + If the Recording has a fixed duration then it will automatically stop + after the target JVM measures that the duration has elapsed. If the + Recording was created with a Continuous Duration then it will collect + data until explicitly stopped. +

      +

      + After Stopping a Recording it remains in the Active section of + the Recordings view. This signifies that the Recording data is still + present in the target JVM, and not within Cryostat's storage. If the + target JVM crashes, is killed, or the process otherwise restarts, then + the Recording data will be lost. To learn how to persist the Flight + Recording data, continue on to + Archive a Recording. +

      + {% endcapture %} + {% include howto_step.html + summary="Stop the Recording" + image-name="4.0.0/startstop-a-recording-3.png" + text=stop-the-recording-additional-content + %} +
    14. +
    diff --git a/version/4.1.0/guides/_subsections/store-credentials.md b/version/4.1.0/guides/_subsections/store-credentials.md new file mode 100644 index 00000000..59281960 --- /dev/null +++ b/version/4.1.0/guides/_subsections/store-credentials.md @@ -0,0 +1,89 @@ +## [Store Credentials](#store-credentials) +If you have Java Management Extensions **(JMX)** or `HTTP` authentication enabled on +your containerized **JVMs**, **Cryostat** will prompt you to enter your credentials +before it can access the **JDK** `Flight Recordings` on your `target` **JVMs**. + +
      +
    1. + {% include howto_step.html + summary="Navigate to the Security tab" + image-name="4.0.0/navigate-to-security.png" + text=" + First, navigate to the Security tab. The Store Credentials table + lists all credentials in Cryostat's Keyring. Click Add to define + a new credential. + " + %} +
    2. +
    3. + {% include howto_step.html + summary="Enter your Credentials" + image-name="4.0.0/store-credentials-1.png" + text=" + A modal will appear. You can select a target JVM to view its + properties. + These properties can be used to define a matchExpression that + tests whether this credential should apply to the selected target JVM. + This is the same kind of matchExpression as those used by + Automated Rules, so you may + find it useful to reuse the same matchExpressions from your + rule definitions for your credential definitions. The + matchExpression, username, and password fields are all required. + " + %} +
    4. +
    5. + {% include howto_step.html + summary="Test your Credentials" + image-name="4.0.0/store-credentials-3.png" + text=" + Navigate to the Test tab to use the Credential Test table + to check if the entered credential is valid for the matched targets. +

      + + You can individually test each target or bulk test all targets at the + same time. The Status column will report the following test + status: + +
        +
      1. + Valid: valid credential for the target JVM. +
      2. +
      3. + Invalid: invalid credential for the target JVM. +
      4. +
      5. + Not applicable: JMX authentication is not enabled on the + target JVM. +
      6. +
      + " + %} +
    6. +
    7. + {% include howto_step.html + summary=" + (Alternative to Steps 1 and 2) Store Credentials when Connecting to a + Target JVM + " + image-name="4.0.0/navigate-to-recordings-1.png" + text=" + Alternatively, credentials may also be stored if you navigate to either + the Recordings tab or the Events tab and select a target + JVM with authentication enabled. The authentication form will appear, + prompting you to enter your credentials. A new credential definition with the provided + username and password will be stored for this specific target application + in the Cryostat Keyring. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="View your Stored Credentials" + image-name="4.0.0/store-credentials-2.png" + text=" + The Store Credentials table will update with a row for each of the credentials you have stored in the Keyring. The matchExpression is visible along with a count of the number of known target applications that these credentials will apply to. You can expand the row to display a list of those matched target applications. For security reasons it is not possible to view the stored username and password associated with a credential definition in the Keyring. + " + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/upload-an-automated-rule.md b/version/4.1.0/guides/_subsections/upload-an-automated-rule.md new file mode 100644 index 00000000..71d856c4 --- /dev/null +++ b/version/4.1.0/guides/_subsections/upload-an-automated-rule.md @@ -0,0 +1,48 @@ +## [Upload an Automated Rule](#upload-an-automated-rule) + +Instead of stepping through the form every time, you can also edit your `Automated Rule` definition files (`JSON` format) locally and quickly upload them. + +Below is an example of a rule file content: + +{% highlight json %} +{ + "name":"my_automated_rule", + "description":"This is an example automated rule.", + "matchExpression":"target.alias == 'io.cryostat.Cryostat'", + "eventSpecifier":"template=Continuous,type=TARGET", + "archivalPeriodSeconds":285, + "initialDelaySeconds":60, + "preservedArchives":10, + "maxAgeSeconds":300, + "maxSizeBytes":0, + "enabled":true +} +{% endhighlight %} + +
      +
    1. + {% include howto_step.html + summary="Open Automated Rules upload Prompt" + image-name="4.0.0/upload-an-automated-rule-1.png" + caption="Click on Upload Icon button to open upload prompt." + %} +
    2. +
    3. + {% include howto_step.html + summary="Attach a Rule File by Dragging & Dropping or clicking Browse...." + image-name="4.0.0/upload-an-automated-rule-2.png" + caption="Select a rule file to upload. The file should not include the "id" field as this will be assigned by the application database." + %} +
    4. +
    5. + Click Submit Button to Upload. +
    6. +
    7. + {% include howto_step.html + summary="Observe the new rule in the Automated Rules table" + image-name="4.0.0/create-an-automated-rule-5.png" + caption=" + The new rule will appear in the Automated Rules table." + %} +
    8. +
    diff --git a/version/4.1.0/guides/_subsections/use-topology-view.md b/version/4.1.0/guides/_subsections/use-topology-view.md new file mode 100644 index 00000000..880f6064 --- /dev/null +++ b/version/4.1.0/guides/_subsections/use-topology-view.md @@ -0,0 +1,113 @@ +## [Use Topology View](#use-topology-view) + +The *Topology View* provides a visual presentation of all the discovered **JVM** applications, and all their associated resources. It also allows users to perform actions on one or multiple `targets`. + +{% include_relative _subsections/common/navigate-to-topology.md %} + +### [View all Target JVMs](#view-all-target-jvms) + +
      + {% capture topology-graphview-guide-text %} + By default, an interactive Graph View of target JVMs (nodes) are shown nested within their associated groups (surrounding lines), for example, Pods, or Realms (i.e. discovery mechanisms to discover Java Applications, such as Kubernetes API, JDP or Cryostat Agent). +

      + + You can drag target nodes/groups or use the bottom control bar to adjust the graph. For example, zoom out or fit all nodes into view. A toolbar is also available to allow further customization: + +
        +
      1. + Display Options: adjust how the nodes and groups are displayed, for example, whether to show connection URL. +
      2. +
      3. + Filters: determine which targets or groups to show. +
      4. +
      5. + Search bar: find a target using Match Expression. The matched targets will be highlighted. +
      6. +
      + {% endcapture %} + {% capture topology-listview-guide-text %} + Topology View also supports List View mode, where your JVM targets and their groups are shown as expandable rows. +

      + Click the List icon on the toolbar to switch to List View. Expand each row to see nested groups or targets. All the above features of the toolbar can also be used to customize your view. + {% endcapture %} + + {% include howto_step.html + summary="View JVM Applications with Graph View" + image-name="4.0.0/topology-1.png" + caption="View JVM applications with Topology Graph view." + text=topology-graphview-guide-text + %} + {% include howto_step.html + summary="View JVM Applications with List View" + image-name="4.0.0/topology-2.png" + caption="View JVM applications with Topology List view." + text=topology-listview-guide-text + %} +
    + +### [View JVM Details and Resources](#view-jvm-details-and-resources) +
      + + {% capture sidebar-detail-guide-text %} + In Graph View, select a target JVM node to open the drawer panel that shows its details, for example, Connection URL, Labels and Annotations. +

      + In List View, expand each row to open nested groups until you find the target. Expand the target to see its details and associated resources. + + {% endcapture %} + + {% capture sidebar-resource-guide-text %} + Navigate to the Resources tab to see the target’s associated resources. There are 2 tables: +
        +
      1. + + Owned Resources: Resources that the JVM owns (i.e. Active Recordings, Archived Recordings, Event Templates and Event Types).
      2. +
      3. + Related Resources: Resources that are tied to the JVM by Match Expression (i.e. Automated Rules and Credentials). +
      4. +
      + + In the Graph View, each target node also has an indicator that tells whether the target has any running Active Recordings. The same information can be seen within the Owned Resources table by expanding the Active Recordings row. + + {% endcapture %} + + {% include howto_step.html + summary="View JVM Details" + image-name="4.0.0/topology-3.png" + caption="View target JVM’s details with drawer panel." + text=sidebar-detail-guide-text + %} + {% include howto_step.html + summary="View JVM's Associated Resources" + image-name="4.0.0/topology-4.png" + caption="View JVM's associated resources with drawer panel." + text=sidebar-resource-guide-text + %} +
    + +### [Perform actions on JVMs](#perform-actions-on-jvms) + +
      + {% capture single-action-guide-text %} + The details panel for each target JVM supports performing simple actions on the JVM. Click the Actions menu to show available options. +

      + For example, select View Recordings to be redirected to the Recordings View for the target JVM, where you can view and manage Active Recordings. + {% endcapture %} + {% capture bulk-action-guide-text %} + The Details panel also supports performing actions on multiple target JVMs. Select a group of targets, for example, a Pod. A drawer panel will appear to show the group details. Select Actions menu to show available options. +

      + For example, select Start recording to start a Recording on all targets JVMs under this group. If this action fails (for example, due to intermittent network issues) then it is safe to repeat this action again: the action will only start new Recordings or replace STOPPED Recordings on targets under this group, it will not affect RUNNING Recordings. + {% endcapture %} + + {% include howto_step.html + summary="Perform Actions for a Single JVM" + image-name="4.0.0/topology-5.png" + caption="Perform actions on an individual JVM." + text=single-action-guide-text + %} + {% include howto_step.html + summary="Perform Actions for a Group of JVMs" + image-name="4.0.0/topology-6.png" + caption="Perform actions on a group of JVMs." + text=bulk-action-guide-text + %} +
    diff --git a/version/4.1.0/guides/_subsections/using-smart-triggers.md b/version/4.1.0/guides/_subsections/using-smart-triggers.md new file mode 100644 index 00000000..49488400 --- /dev/null +++ b/version/4.1.0/guides/_subsections/using-smart-triggers.md @@ -0,0 +1,92 @@ +## [Using Smart Triggers](#using-smart-triggers) +**Cryostat Agent** supports custom triggers that are based on MBean metric values. You can configure **Cryostat Agent** to start **JFR** `Recordings` dynamically when these custom trigger conditions are met. + +You can set up a custom trigger condition in **Cryostat** to initiate Java Flight Recorder **(JFR)** `Recordings` dynamically. This trigger condition is based on MBean counters, covering various runtime, memory, thread, and OS metrics. The condition includes MBean counter types and allows specifying a duration for the trigger to activate only if the specified values persist for that duration. **Cryostat's Agent** supports smart triggers, which continuously monitor MBean counter values. When the current values match the configured conditions for the specified duration, the trigger initiates a **JFR** `Recording` dynamically through the **Cryostat Agent**. + +**Note**: A **JFR** `Recording` will not start dynamically if the custom trigger condition associated with this `Recording` is not met. + +#### [Configure Custom Trigger for Dynamic Recording](#configure-custom-trigger-for-dynamic-recording) +When you configure your `target` application to load the **Cryostat Agent**, you can define one or more custom triggers that are then passed as arguments to the **Agent**. +For more information, learn how to [use the Cryostat Agent](#using-the-cryostat-agent). + +#### [Options for Defining a Custom Trigger](#options-for-defining-a-custom-trigger) +You can define a custom trigger in any of the following ways: + +
      +
    1. +
      + Appending a Custom Trigger to the Cryostat Agent’s JAR File Path +

      +The following example shows how to append a simple custom trigger to the Cryostat Agent’s JAR file path: +

      +
      +  JAVA_OPTS="-javaagent:/deployments/app/cryostat-agent-shaded.jar=[ProcessCpuLoad > 0.2 ; TargetDuration > duration("30s")]~profile"
      +      
      +

      + The preceding example trigger instructs the Agent to start a JFR Recording if the ProcessCpuLoad metric has a value greater than 0.2 for a duration of more than 30 seconds: This example also instructs the Agent to use the Profile event template for the JFR Recording. +

      +
      +
    2. +
    3. +
      + Using a JVM System Property Flag +

      +The following example shows how to specify a simple custom trigger by using a JVM system property flag: +

      +
      +  -Dcryostat.agent.smart-trigger.definitions="[ProcessCpuLoad > 0.2 ; TargetDuration > duration(\"30s\")]~profile"
      +      
      +

      + This example uses the same custom trigger criteria as the preceding example. +

      +
      +
    4. +
    5. +
      + Using an Environment Variable +

      +The following example shows how to specify a simple custom trigger by using an environment variable: +

      +
      +  - name: CRYOSTAT_AGENT_SMART_TRIGGER_DEFINITIONS
      +    value: "[ProcessCpuLoad > 0.2 ; TargetDuration > duration(\"30s\")]~profile"
      +      
      +

      +This example uses the same custom trigger criteria as the preceding examples. +

      +
      +
    6. +
    + +#### [General Syntax Rules for Custom Triggers](#general-syntax-rules-for-custom-triggers) +Consider the following syntax guidelines for defining custom triggers: +
      +
    1. A custom trigger definition must consist of both an expression that defines the overall trigger condition and the name of an event template that is used for the JFR Recording.
    2. +
    3. The entire trigger expression must be enclosed in square brackets. For example:
      [ProcessCpuLoad > 0.2 ; TargetDuration < duration("30s")]
    4. +
    5. The name of the event template must be defined after the trigger expression and preceded by a tilde (~) character. For example:
      ~profile
    6. +
    7. A trigger expression can consist of one or more constraints and a target duration. The set of constraints and target duration must be separated by a semicolon (;) character.
    8. +
    9. Each constraint must include: the name of an MBean counter; a relational operator such as > (greater than), = (equal to), <(less than), and so on; and a specified value. The type of relational operator and value that you can specify depends on the associated MBean counter type. For example:
      ProcessCpuLoad > 0.2
    10. +
    11. Constraints can be grouped together by using logical operators such as && (AND), || (OR), or ! (NOT) logic. For readability and clarity around the order of operations and operator precedence, grouped constraints may be enclosed in round brackets, but this is not a requirement. For example: +
      +  [(MetricA > value1 && MetricB < value2) || MetricC == 'stringvalue' ; TargetDuration > duration("30s")]
      +    
      +
    12. +
    13. + The name of each MBean counter that is specified as part of a custom trigger must follow precise syntax rules in terms of spelling and capitalization. +
    14. +
    15. + Only one target duration can be defined for a custom trigger. The target duration is applied to the entire trigger expression that is enclosed within the square brackets +
    16. +
    17. + A target duration can be expressed in terms of seconds, minutes, or hours. For example, 30s means 30 seconds, 5m means five minutes, 2h means two hours, and so on. +
    18. +
    19. + A target duration is optional. If a target duration is not specified, triggering will occur immediately once the trigger conditions are met. +
    20. +
    21. + Multiple custom trigger definitions can be specified together, each of which relates to a separate JFR Recording. Different custom trigger definitions must be separated by a comma (,) character. For example: +
      +  [ProcessCpuLoad>0.2]~profile,[ThreadCount>30]~Continuous
      +    
      +
    22. +
    diff --git a/version/4.1.0/guides/_subsections/using-the-cryostat-agent.md b/version/4.1.0/guides/_subsections/using-the-cryostat-agent.md new file mode 100644 index 00000000..334e44cd --- /dev/null +++ b/version/4.1.0/guides/_subsections/using-the-cryostat-agent.md @@ -0,0 +1,20 @@ +## [Using the Cryostat Agent](#using-the-cryostat-agent) + +The **Cryostat Agent** is an optional component of **Cryostat**, implemented as a **Java Instrumentation Agent**, which acts as a plugin for applications running on the **JVM**. Prior to the **Agent**, **Cryostat** always extracted data from the **JVM** by initiating a connection over **JMX**. It then fetched the **JFR** data from an **MBean** and pulled it over the network back toward the **Cryostat** server to make it accessible to end users. + +The **Agent** works differently. It is responsible for fetching data from the **JVM** and sending it back to **Cryostat** over `HTTP`. The **Agent** works by looking for **MBean** and **JFR** data within itself and the application it is plugged into. It is also able to communicate back to **Cryostat** about the application instance the **Cryostat Agent** is attached to and how to reach it. The **Cryostat Agent** also pushes its own Java Flight Recorder **(JFR)** data back to **Cryostat** by initiating network connections with **Cryostat**, which may then analyze and save the data to make it accessible to end users. + +The **Agent** may also be configured, using the property `cryostat.agent.api.writes-enabled` or the corresponding environment variable `CRYOSTAT_AGENT_API_WRITES_ENABLED`, to allow bi-directional read-write access over `HTTP`. This enables dynamic *Start/Stop/Delete* of `Flight Recordings` as well as on-demand **JFR** pulls much like what **Cryostat** does over **JMX**. + +The programming interfaces for **Cryostat** and its **Agent** are designed to implement **Cryostat's** specific feature set, rather than being generalized and flexible like **JMX**. The benefit of this is that the security considerations are easier to understand and model, but choosing to use the **Cryostat Agent** over **JMX** may also forego the ability to interoperate with other **JMX** tooling such as `JDK Mission Control`, `visualvm`, `jconsole`, `hawtio`, etc. + +
      +
    1. The Cryostat Agent retrieves a wide range of information from those Cryostat applications such as memory usage, CPU utilization, etc.
    2. +
    3. The Cryostat analyzes these collected data to identify problems that might be affecting the application’s performance.
    4. +
    5. The Agent is a third-party Java Instrumentation Agent for developers which can be installed on the target JVM program through the command-line arguments or directly attaching to the running JVM instance.
    6. +
    7. The Agent is foreign code for developers to audit and inspect before including it in their application builds. It is a small amount of code to inspect and likely easier to trust than JMX.
    8. +
    9. Unlike JMX, the JVM doesn’t come with the Agent included, so developers are required to add the Cryostat Agent to their application builds, then rebuild and deploy the application.
    10. +
    11. Once the Agent has been installed or attached to the running JVM instance, it can begin collecting data and sending it to Cryostat for analysis. If enabled, the Cryostat server that the Cryostat Agent is registered with may also begin to send remote management requests to dynamically Start, Stop, or Delete Flight Recordings as well as to retrieve JFR and MBean data.
    12. +
    + +For instructions on how to install the **Cryostat Agent** into your applications, [check the Setup section in Getting Started](/get-started/#using-the-cryostat-agent). diff --git a/version/4.1.0/guides/_subsections/view-archived-recordings.md b/version/4.1.0/guides/_subsections/view-archived-recordings.md new file mode 100644 index 00000000..2322f889 --- /dev/null +++ b/version/4.1.0/guides/_subsections/view-archived-recordings.md @@ -0,0 +1,73 @@ +## [Viewing Archived Recordings](#viewing-archived-recordings) +There are several ways to view Archived Recordings. The first method is to navigate to the Archived Recordings tab. See Archive a Recording. + +### [All-Targets Archived Recordings View](#all-targets-archived-recordings-view) + +The second method is to navigate to the All-Targets archived recording view within the Archives tab on Cryostat console sidebar. + +The All-Targets view gathers all of Cryostat's discovered target JVM applications into one section for ease of access. Here, we are able to interact with any Archived Recordings that have been saved from a source target by opening a target's nested recordings table. + +
      +
    1. + {% capture navigate-to-all-targets-include-text %} +

      + The option to automatically hide all targets with zero Archived Recordings is on by default and can be toggled. Targets can also be filtered in the search bar. +

      + {% endcapture %} + {% include howto_step.html + summary="Navigate to the All-Targets Archived Recordings view" + image-name="4.0.0/navigate-to-all-targets.png" + caption="Click on the Archives tab on the sidebar, and the first tab should automatically be selected as the All Targets Archives view." + text=navigate-to-all-targets-include-text + %} + +
    2. +
    3. + {% capture click-on-source-target-include-text %} + {% endcapture %} + {% include howto_step.html + summary="Select a Source Target Application" + image-name="4.0.0/view-archives-recordings-1.png" + caption="Clicking the dropdown arrow next to a target name will list any Archived Recordings originating from that source target." + text=click-on-source-target-include-text + %} +
    4. +
    + +### [All-Archives Archived Recordings View](#all-archives-archived-recordings-view) + +The third method is to navigate to the All-Archives Archived Recording view within the Archives tab on **Cryostat** console sidebar. + +The *All-Archives* view is a view which queries **Cryostat's** internal storage for any created `Archived Recordings` and the directories that contain them. Here, we are able to interact with any `Archived Recordings` that have been saved into storage by opening a nested recordings table within each directory. + +This view is used to save any lost `Archived Recordings` in case any `target` **JVM** restarts or exits. It will be empty if no Recordings are currently saved to storage. + +
      +
    1. + {% capture navigate-to-all-archives-include-text %} +

      + Directories can be filtered in the search bar. +

      + {% endcapture %} + {% include howto_step.html + summary="Navigate to the All-Archives Archived Recordings View" + image-name="4.0.0/navigate-to-all-archives.png" + caption="Click on the Archives tab on the sidebar, and select the second tab titled All Archives." + text=navigate-to-all-archives-include-text + %} + +
    2. +
    3. + {% capture click-on-directory-include-text %} +

      + A directory name is related to its corresponding source target's serviceUrl. Mousing over the tooltip, we can also see a Cryostat generated hash ID for that target. +

      + {% endcapture %} + {% include howto_step.html + summary="Select an Archives directory" + image-name="4.0.0/view-archives-recordings-2.png" + caption="Clicking the dropdown arrow next to a directory name will list any Archived Recordings within that directory in the Cryostat storage. Again, we can interact with any Archived Recordings in a similar fashion as before." + text=click-on-directory-include-text + %} +
    4. +
    diff --git a/version/4.1.0/guides/_subsections/view-in-grafana.md b/version/4.1.0/guides/_subsections/view-in-grafana.md new file mode 100644 index 00000000..c668cf22 --- /dev/null +++ b/version/4.1.0/guides/_subsections/view-in-grafana.md @@ -0,0 +1,50 @@ +## [View a Recording in Grafana](#view-a-recording-in-grafana) +**Cryostat** provides integration with **Grafana** to plot curated time series +metrics from a `Recording`. By selecting _View in Grafana_ on either an +`Active` or `Archived Recording`, **Cryostat** uploads your `Recording` to +a custom **Grafana Data Source**, and launches **Grafana** in a new browser +tab. If **Cryostat** was installed to a **Kubernetes/OpenShift** cluster using the +**Cryostat Operator** or **Cryostat Helm Chart**, your browser should reuse the +same login credentials (if any) as for the Cryostat UI itself. If you are +greeted by a login page then simply log in again using your same account credentials +which you use to log in to Cryostat. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md %} +
    2. +
    3. + {% include_relative _subsections/common/navigate-to-recordings.md %} +
    4. +
    5. + {% include_relative _subsections/common/select-a-recording.md + select-a-recording-caption=" + If you do not have any Recordings present in the Active Recordings + view, follow + Start/Stop a Recording + to create one, or select a different Target application. + You may also select an Archived Recording to view in Grafana. + " + %} +
    6. +
    7. + {% include howto_step.html + summary="Select View in Grafana..." + image-name="4.0.0/view-in-grafana-1.png" + caption=" + Select View in Grafana... from the Recording's overflow + menu. + " + %} +
    8. +
    9. + {% include howto_step.html + summary="View and Interact With Data From Your Recording" + image-name="4.0.0/view-in-grafana-2.png" + caption=" + Observe the plotted time series data from curated metrics in your + Recording. Select time ranges to zoom into the data. + " + %} +
    10. +
    diff --git a/version/4.1.0/guides/_subsections/view-jfr-event-types.md b/version/4.1.0/guides/_subsections/view-jfr-event-types.md new file mode 100644 index 00000000..a74ee952 --- /dev/null +++ b/version/4.1.0/guides/_subsections/view-jfr-event-types.md @@ -0,0 +1,50 @@ +## [View JFR Event Types](#view-jfr-event-types) +The **JVM** comes with many built-in **JDK Flight Recorder** *Event Types* out-of-the-box. +You can also register new *event types* at the framework- or application-level using the +`jdk.jfr` API. **Cryostat** can list out all of a *Target* **JVM**'s registered *event types* +so you can see what kind of data may be captured by **Flight Recordings**. + +
      +
    1. + {% include_relative _subsections/common/select-target-application.md + select-target-application-additional-content=" + The Target selected will provide the base Continuous and + Profiling template definitions to start from. Most target + applications will be interchangeable here. + " + %} +
    2. +
    3. + {% capture navigate-to-events-include-text %} +

      + If the Target JVM has SSL/TLS enabled on JMX connections then it may be + necessary to add the Target's certificate to Cryostat's trust store. Go + to Add a Trusted Certificate + and return to this section after completing that guide. + + + +

      + {% endcapture %} + {% include howto_step.html + summary="Navigate to Events" + image-name="4.0.0/navigate-to-events-1.png" + caption=" + Supply JMX credentials to authenticate to the target, if necessary. If + the target is not configured with JMX authentication then the + connection attempt will continue without prompting for credentials. + " + text=navigate-to-events-include-text + %} +
    4. +
    5. + {% include howto_step.html + summary="Navigate to Event Types" + image-name="4.0.0/navigate-to-event-types-1.png" + caption=" + Select the Event Types tab to view a table listing of all the JDK Flight Recorder + Event Types registered in the Target JVM. + " + %} +
    6. +
    diff --git a/version/4.1.0/guides/index.md b/version/4.1.0/guides/index.md new file mode 100644 index 00000000..e77055ac --- /dev/null +++ b/version/4.1.0/guides/index.md @@ -0,0 +1,67 @@ +--- +layout: guides +title: Guides on Using Cryostat +--- + +This section explains some common **Cryostat** features by example, illustrating +common actions and workflows of interest and why they are useful. + +* auto-gen TOC: +{:toc} + +{% include_relative _subsections/getting-help.md %} + +{% include_relative _subsections/configure-feature-level.md %} + +{% include_relative _subsections/navigate-the-dashboard.md %} + +{% include_relative _subsections/perform-garbage-collection.md %} + +{% include_relative _subsections/use-topology-view.md %} + +{% include_relative _subsections/create-a-custom-target.md %} + +{% include_relative _subsections/using-the-cryostat-agent.md %} + +{% include_relative _subsections/configure-agent-harvester.md %} + +{% include_relative _subsections/using-smart-triggers.md %} + +{% include_relative _subsections/startstop-a-recording.md %} + +{% include_relative _subsections/snapshot-a-recording.md %} + +{% include_relative _subsections/archive-a-recording.md %} + +{% include_relative _subsections/view-archived-recordings.md %} + +{% include_relative _subsections/download-an-active-or-archived-recording.md %} + +{% include_relative _subsections/re-upload-a-recording-to-archives.md %} + +{% include_relative _subsections/view-jfr-event-types.md %} + +{% include_relative _subsections/download-edit-and-upload-a-customized-event-template.md %} + +{% include_relative _subsections/edit-template-with-jmc.md %} + +{% include_relative _subsections/view-in-grafana.md %} + +{% include_relative _subsections/automated-analysis.md %} + +{% include_relative _subsections/add-and-edit-recording-metadata-labels.md %} + +{% include_relative _subsections/store-credentials.md %} + +{% include_relative _subsections/add-a-trusted-certificate.md %} + +{% include_relative _subsections/create-an-automated-rule.md %} + +{% include_relative _subsections/upload-an-automated-rule.md %} + +{% include_relative _subsections/download-an-automated-rule.md %} + +{% include_relative _subsections/configure-graphical-notifications.md %} + +[comment]: # ## [Analyze Recordings Online](#analyze-recordings-online) +[comment]: # TODO