From d218baf3d720301c5d2a6f3f5c98200d7960758b Mon Sep 17 00:00:00 2001 From: Dusan Petrovic Date: Wed, 14 Aug 2024 14:59:02 +0200 Subject: [PATCH] Added metrics support for Cloud Assets --- .../cloud.oracle/external/binaries-list | 1 + .../external/oci-java-sdk-3.25.3-license.txt | 2 +- .../cloud.oracle/nbproject/project.properties | 1 + enterprise/cloud.oracle/nbproject/project.xml | 4 + .../cloud/oracle/adm/ShowInBrowserAction.java | 1 + .../oracle/assets/AddNewAssetCommand.java | 24 +++- .../cloud/oracle/assets/CloudAssets.java | 4 + .../oracle/assets/DependenciesAnalyzer.java | 1 + .../cloud/oracle/assets/DependencyUtils.java | 57 ++++++-- .../oracle/assets/PropertiesGenerator.java | 28 +++- .../cloud/oracle/assets/SuggestedItem.java | 5 +- .../cloud/oracle/developer/MetricsItem.java | 72 ++++++++++ .../developer/MetricsNamespaceItem.java | 34 +++++ .../developer/MetricsNamespaceNode.java | 84 +++++++++++ .../cloud/oracle/developer/MetricsNode.java | 89 ++++++++++++ .../modules/cloud/oracle/resources/layer.xml | 20 +++ .../cloud/oracle/resources/metrics.svg | 133 ++++++++++++++++++ .../oracle/resources/metrics_namespace.svg | 133 ++++++++++++++++++ .../cloud/oracle/steps/ItemTypeStep.java | 1 + .../cloud/oracle/steps/SuggestedStep.java | 6 + .../integration/cloud-cookies.contextValues | 4 +- .../modules/nbcode/integration/layer.xml | 1 + java/java.lsp.server/vscode/package.json | 24 +++- 23 files changed, 704 insertions(+), 25 deletions(-) create mode 100644 enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsItem.java create mode 100644 enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceItem.java create mode 100644 enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceNode.java create mode 100644 enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNode.java create mode 100644 enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics.svg create mode 100644 enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics_namespace.svg diff --git a/enterprise/cloud.oracle/external/binaries-list b/enterprise/cloud.oracle/external/binaries-list index cc4884799098..68d8b5d41c34 100644 --- a/enterprise/cloud.oracle/external/binaries-list +++ b/enterprise/cloud.oracle/external/binaries-list @@ -33,6 +33,7 @@ D9918C04C60741D1BBEFBCC82E9D3B8BE690D412 com.oracle.oci.sdk:oci-java-sdk-objects A7D98B96CEA17F78E4BB9270B4A60FEBFACF6C78 com.oracle.oci.sdk:oci-java-sdk-core:3.25.3 2236737DDF39CA3A3BABDB58B41F50C47E861EA7 com.oracle.oci.sdk:oci-java-sdk-containerengine:3.25.3 923F38FE7186DFCBF921F9B3626832FFFFB8F6E9 com.oracle.oci.sdk:oci-java-sdk-artifacts:3.25.3 +99AE5824FBBABF71475404EE19AA480973CBD790 com.oracle.oci.sdk:oci-java-sdk-monitoring:3.25.3 E5F6CAE5CA7ECAAC1EC2827A9E2D65AE2869CADA org.apache.httpcomponents:httpclient:4.5.13 853B96D3AFBB7BF8CC303FE27EE96836A10C1834 org.apache.httpcomponents:httpcore:4.4.13 diff --git a/enterprise/cloud.oracle/external/oci-java-sdk-3.25.3-license.txt b/enterprise/cloud.oracle/external/oci-java-sdk-3.25.3-license.txt index 10b6404ef8f3..cb25afd8e8f7 100644 --- a/enterprise/cloud.oracle/external/oci-java-sdk-3.25.3-license.txt +++ b/enterprise/cloud.oracle/external/oci-java-sdk-3.25.3-license.txt @@ -3,7 +3,7 @@ Description: Oracle Cloud Infrastructure SDK for Java Origin: https://github.com/oracle/oci-java-sdk Version: 3.25.3 License: UPL-Apache-2.0 -Files: oci-java-sdk-circuitbreaker-3.25.3.jar, oci-java-sdk-common-3.25.3.jar, oci-java-sdk-database-3.25.3.jar, oci-java-sdk-identity-3.25.3.jar, oci-java-sdk-workrequests-3.25.3.jar, oci-java-sdk-adm-3.25.3.jar, oci-java-sdk-devops-3.25.3.jar, oci-java-sdk-addons-apache-configurator-jersey-3.25.3.jar, oci-java-sdk-common-httpclient-3.25.3.jar, oci-java-sdk-common-httpclient-jersey-3.25.3.jar oci-java-sdk-keymanagement-3.25.3.jar oci-java-sdk-vault-3.25.3.jar oci-java-sdk-containerengine-3.25.3.jar oci-java-sdk-core-3.25.3.jar oci-java-sdk-objectstorage-3.25.3.jar oci-java-sdk-objectstorage-extensions-3.25.3.jar oci-java-sdk-objectstorage-generated-3.25.3.jar, oci-java-sdk-artifacts-3.25.3.jar +Files: oci-java-sdk-circuitbreaker-3.25.3.jar, oci-java-sdk-common-3.25.3.jar, oci-java-sdk-database-3.25.3.jar, oci-java-sdk-identity-3.25.3.jar, oci-java-sdk-workrequests-3.25.3.jar, oci-java-sdk-adm-3.25.3.jar, oci-java-sdk-devops-3.25.3.jar, oci-java-sdk-addons-apache-configurator-jersey-3.25.3.jar, oci-java-sdk-common-httpclient-3.25.3.jar, oci-java-sdk-common-httpclient-jersey-3.25.3.jar oci-java-sdk-keymanagement-3.25.3.jar oci-java-sdk-vault-3.25.3.jar oci-java-sdk-containerengine-3.25.3.jar oci-java-sdk-core-3.25.3.jar oci-java-sdk-objectstorage-3.25.3.jar oci-java-sdk-objectstorage-extensions-3.25.3.jar oci-java-sdk-objectstorage-generated-3.25.3.jar, oci-java-sdk-artifacts-3.25.3.jar, oci-java-sdk-monitoring-3.25.3.jar Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. diff --git a/enterprise/cloud.oracle/nbproject/project.properties b/enterprise/cloud.oracle/nbproject/project.properties index 7463cc5d67a8..aed694b30b1f 100644 --- a/enterprise/cloud.oracle/nbproject/project.properties +++ b/enterprise/cloud.oracle/nbproject/project.properties @@ -34,6 +34,7 @@ release.external/oci-java-sdk-objectstorage-extensions-3.25.3.jar=modules/ext/oc release.external/oci-java-sdk-core-3.25.3.jar=modules/ext/oci-java-sdk-core-3.25.3.jar release.external/oci-java-sdk-containerengine-3.25.3.jar=modules/ext/oci-java-sdk-containerengine-3.25.3.jar release.external/oci-java-sdk-artifacts-3.25.3.jar=modules/ext/oci-java-sdk-artifacts-3.25.3.jar +release.external/oci-java-sdk-monitoring-3.25.3.jar=modules/ext/oci-java-sdk-monitoring-3.25.3.jar release.external/httpclient-4.5.13.jar=modules/ext/httpclient-4.5.13.jar release.external/httpcore-4.4.13.jar=modules/ext/httpcore-4.4.13.jar release.external/javassist-3.25.0-GA.jar=modules/ext/javassist-3.25.0-GA.jar diff --git a/enterprise/cloud.oracle/nbproject/project.xml b/enterprise/cloud.oracle/nbproject/project.xml index 625d703e1cfc..a5d3a6a9c3f2 100644 --- a/enterprise/cloud.oracle/nbproject/project.xml +++ b/enterprise/cloud.oracle/nbproject/project.xml @@ -363,6 +363,10 @@ ext/oci-java-sdk-artifacts-3.25.3.jar external/oci-java-sdk-artifacts-3.25.3.jar + + ext/oci-java-sdk-monitoring-3.25.3.jar + external/oci-java-sdk-monitoring-3.25.3.jar + ext/httpclient-4.5.13.jar external/httpclient-4.5.13.jar diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ShowInBrowserAction.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ShowInBrowserAction.java index 6dd876dda1fe..4c3ed848c9b0 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ShowInBrowserAction.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/adm/ShowInBrowserAction.java @@ -45,6 +45,7 @@ @ActionReference(path = "Cloud/Oracle/KnowledgeBase/Actions", position = 260), @ActionReference(path = "Cloud/Oracle/Vulnerability/Actions", position = 260), @ActionReference(path = "Cloud/Oracle/VulnerabilityAudit/Actions", position = 260), + @ActionReference(path = "Cloud/Oracle/MetricsNamespace/Metrics/Actions", position = 260), }) @NbBundle.Messages({ diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/AddNewAssetCommand.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/AddNewAssetCommand.java index 107b880aeb30..67ec5de19158 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/AddNewAssetCommand.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/AddNewAssetCommand.java @@ -59,9 +59,17 @@ public class AddNewAssetCommand implements CommandProvider { put("Databases", new String[]{"io.micronaut.oraclecloud", "micronaut-oraclecloud-atp"}); //NOI18N put("Bucket", new String[]{"io.micronaut.objectstorage", "micronaut-object-storage-oracle-cloud"}); //NOI18N put("Vault", new String[]{"io.micronaut.oraclecloud", "micronaut-oraclecloud-vault"}); //NOI18N + put("MetricsNamespace", new String[]{"io.micronaut.oraclecloud", "micronaut-oraclecloud-micrometer"}); //NOI18N } }; + private static final Map ANNOTATION_PROCESSOR_MAP = new HashMap() { + { + put("MetricsNamespace", new String[]{"io.micronaut.micrometer", "micronaut-micrometer-annotation"}); //NOI18N + } + }; + + @Override public Set getCommands() { return Collections.unmodifiableSet(COMMANDS); @@ -78,16 +86,15 @@ public CompletableFuture runCommand(String command, List argumen return new TenancyStep(); }).stepForClass(TenancyStep.class, (s) -> new CompartmentStep()) .stepForClass(CompartmentStep.class, (s) -> new SuggestedStep(null)) - .stepForClass(SuggestedStep.class, (s) -> new ProjectStep()) + .stepForClass(SuggestedStep.class, (s) -> new ProjectStep()) .build(); - Steps.getDefault() .executeMultistep(new ItemTypeStep(), Lookups.fixed(nsProvider)) .thenAccept(values -> { Project project = values.getValueForStep(ProjectStep.class); CompletableFuture item = null; String itemType = values.getValueForStep(ItemTypeStep.class); - if ("Databases".equals(itemType)) { + if ("Databases".equals(itemType)) { DatabaseItem i = values.getValueForStep(DatabaseConnectionStep.class); if (i == null) { item = new AddADBAction().addADB(); @@ -117,15 +124,20 @@ public CompletableFuture runCommand(String command, List argumen item.thenAccept(i -> { CloudAssets.getDefault().addItem(i); String[] art = DEP_MAP.get(i.getKey().getPath()); + String[] processor = ANNOTATION_PROCESSOR_MAP.get(i.getKey().getPath()); try { - DependencyUtils.addDependency(project, art[0], art[1]); - future.complete(null); + if (art != null && art.length > 1) { + DependencyUtils.addDependency(project, art[0], art[1]); + } + if (processor != null && processor.length > 1) { + DependencyUtils.addAnnotationProcessor(project, processor[0], processor[1]); + } } catch (IllegalStateException e) { future.completeExceptionally(e); } + future.complete(null); }); }); return future; } - } diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/CloudAssets.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/CloudAssets.java index 8f1804813841..232f233e4e2e 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/CloudAssets.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/CloudAssets.java @@ -56,6 +56,7 @@ import org.netbeans.modules.cloud.oracle.compute.ComputeInstanceItem; import org.netbeans.modules.cloud.oracle.database.DatabaseItem; import org.netbeans.modules.cloud.oracle.developer.ContainerRepositoryItem; +import org.netbeans.modules.cloud.oracle.developer.MetricsNamespaceItem; import org.netbeans.modules.cloud.oracle.items.OCID; import org.netbeans.modules.cloud.oracle.items.OCIItem; import org.netbeans.modules.cloud.oracle.vault.VaultItem; @@ -353,6 +354,9 @@ synchronized void loadAssets() { case "ContainerRepository": //NOI18N loaded.add(gson.fromJson(element, ContainerRepositoryItem.class)); break; + case "MetricsNamespace": //NOI18N + loaded.add(gson.fromJson(element, MetricsNamespaceItem.class)); + break; } } reader.endArray(); diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependenciesAnalyzer.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependenciesAnalyzer.java index 3fd0013fb382..4df0d9ae153b 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependenciesAnalyzer.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependenciesAnalyzer.java @@ -39,6 +39,7 @@ public final class DependenciesAnalyzer implements SuggestionAnalyzer { put("micronaut-oraclecloud-atp", "Databases"); //NOI18N put("micronaut-object-storage-oracle-cloud", "Bucket"); //NOI18N put("micronaut-oraclecloud-vault", "Vault"); //NOI18N + put("micronaut-oraclecloud-micrometer", "MetricsNamespace"); //NOI18N } }; diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependencyUtils.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependencyUtils.java index 5d5548045ba8..77e63b23b52a 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependencyUtils.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/DependencyUtils.java @@ -26,7 +26,9 @@ import org.netbeans.modules.project.dependency.ArtifactSpec; import org.netbeans.modules.project.dependency.Dependency; import org.netbeans.modules.project.dependency.DependencyChange; +import org.netbeans.modules.project.dependency.DependencyChange.Options; import org.netbeans.modules.project.dependency.DependencyChangeException; +import org.netbeans.modules.project.dependency.DependencyChangeRequest; import org.netbeans.modules.project.dependency.ProjectDependencies; import org.netbeans.modules.project.dependency.ProjectOperationException; import org.netbeans.modules.project.dependency.Scopes; @@ -38,30 +40,57 @@ * @author Jan Horvath */ public class DependencyUtils { - + public static void addDependency(Project project, String groupId, String artifactId) { - Project projectToModify = null; - Set subProjects = ProjectUtils.getContainedProjects(project, false); - for (Project subProject : subProjects) { - if ("oci".equals(subProject.getProjectDirectory().getName())) { //NOI18N - projectToModify = subProject; - break; - } - } - if (projectToModify == null) { - projectToModify = project; - } + Project projectToModify = getProjectToModify(project, "oci"); + if (projectToModify != null) { ArtifactSpec spec = ArtifactSpec.make(groupId, artifactId); Dependency dep = Dependency.make(spec, Scopes.COMPILE); - DependencyChange change = DependencyChange.add(Collections.singletonList(dep), DependencyChange.Options.skipConflicts); + DependencyChange change = DependencyChange.add(Collections.singletonList(dep), Options.skipConflicts); try { ModificationResult mod = ProjectDependencies.modifyDependencies(projectToModify, change); mod.commit(); } catch (IOException | DependencyChangeException | ProjectOperationException ex) { throw new IllegalStateException(ex); - } + } } } + public static void addAnnotationProcessor(Project project, String groupId, String artifactId) { + Project projectToModify = getProjectToModify(project, "lib"); + + if (projectToModify != null) { + ArtifactSpec spec = ArtifactSpec.make(groupId, artifactId); + Dependency dep = Dependency.make(spec, Scopes.PROCESS); + DependencyChange change = DependencyChange.builder(DependencyChange.Kind.ADD) + .dependency(dep) + .option(Options.skipConflicts) + .create(); + + try { + ModificationResult mod = ProjectDependencies + .modifyDependencies(projectToModify, new DependencyChangeRequest(Collections.singletonList(change))); + mod.commit(); + } catch (IOException | DependencyChangeException | ProjectOperationException ex) { + throw new IllegalStateException(ex); + } + } + } + + private static Project getProjectToModify(Project project, String projectDirectory) { + Project projectToModify = null; + Set subProjects = ProjectUtils.getContainedProjects(project, false); + for (Project subProject : subProjects) { + if (projectDirectory.equals(subProject.getProjectDirectory().getName())) { //NOI18N + projectToModify = subProject; + break; + } + } + if (projectToModify == null) { + projectToModify = project; + } + + return projectToModify; + } } diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/PropertiesGenerator.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/PropertiesGenerator.java index d6b86efa2f85..9adcad1b425d 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/PropertiesGenerator.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/PropertiesGenerator.java @@ -28,6 +28,7 @@ import org.netbeans.api.db.explorer.ConnectionManager; import org.netbeans.api.db.explorer.DatabaseConnection; import org.netbeans.modules.cloud.oracle.bucket.BucketItem; +import org.netbeans.modules.cloud.oracle.developer.MetricsNamespaceItem; import org.netbeans.modules.cloud.oracle.items.OCIItem; import org.netbeans.modules.cloud.oracle.vault.VaultItem; @@ -53,7 +54,18 @@ public final class PropertiesGenerator { "oci.config.instance-principal.enabled", "oci.vault.config.enabled", "oci.vault.vaults[0].ocid", - "oci.vault.vaults[0].compartment-ocid" + "oci.vault.vaults[0].compartment-ocid", + "micronaut.metrics.enabled", + "micronaut.metrics.binders.files.enabled", + "micronaut.metrics.binders.jdbc.enabled", + "micronaut.metrics.binders.jvm.enabled", + "micronaut.metrics.binders.logback.enabled", + "micronaut.metrics.binders.processor.enabled", + "micronaut.metrics.binders.uptime.enabled", + "micronaut.metrics.binders.web.enabled", + "micronaut.metrics.export.oraclecloud.enabled", + "micronaut.metrics.export.oraclecloud.namespace", + "micronaut.metrics.export.oraclecloud.compartmentId" ); public PropertiesGenerator(boolean local) { @@ -113,6 +125,20 @@ public PropertiesGenerator(boolean local) { } } } + break; + case "MetricsNamespace": //NOI18N + application.put("micronaut.metrics.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.files.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.jdbc.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.jvm.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.logback.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.processor.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.uptime.enabled", "true"); //NOI18N + application.put("micronaut.metrics.binders.web.enabled", "true"); //NOI18N + application.put("micronaut.metrics.export.oraclecloud.enabled", "true"); //NOI18N + application.put("micronaut.metrics.export.oraclecloud.namespace", ((MetricsNamespaceItem) item).getName()); //NOI18N + application.put("micronaut.metrics.export.oraclecloud.compartmentId", ((MetricsNamespaceItem) item).getCompartmentId()); //NOI18N + } } if (!local) { diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/SuggestedItem.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/SuggestedItem.java index 3726f69f8503..ed1092b33d12 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/SuggestedItem.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/assets/SuggestedItem.java @@ -34,7 +34,8 @@ "SelectBucket=Select Object Storage Bucket", "SelectCluster=Select Oracle Container Engine for Kubernetes", "SelectCompute=Select Compute Instance", - "SelectContainerRepository=Select Container Repository" + "SelectContainerRepository=Select Container Repository", + "SelectMetricsNamespace=Select Metrics Namespace" }) public final class SuggestedItem extends OCIItem { @@ -69,6 +70,8 @@ public static SuggestedItem forPath(String path) { return new SuggestedItem("ComputeInstance", Bundle.SelectCompute(), Collections.singleton("Cluster")); //NOI18N case "ContainerRepository": //NOI18N return new SuggestedItem("ContainerRepository", Bundle.SelectContainerRepository(), Collections.singleton("ContainerRepository")); //NOI18N + case "MetricsNamespace": //NOI18N + return new SuggestedItem("MetricsNamespace", Bundle.SelectMetricsNamespace(), Collections.singleton("MetricsNamespace")); //NOI18N default: throw new IllegalArgumentException(""); } diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsItem.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsItem.java new file mode 100644 index 000000000000..8e4b23d833c7 --- /dev/null +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsItem.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.cloud.oracle.developer; + +import java.net.MalformedURLException; +import java.net.URL; +import org.netbeans.modules.cloud.oracle.adm.URLProvider; +import org.netbeans.modules.cloud.oracle.items.OCID; +import org.netbeans.modules.cloud.oracle.items.OCIItem; +import org.openide.util.Exceptions; + +/** + * + * @author Dusan Petrovic + */ +public class MetricsItem extends OCIItem implements URLProvider { + + private static final String DEFAULT_AGGREGATION_FUNCTION = "mean()"; + private static final String DEFAULT_INTERVAL = "1m"; + private static final String BASE_URL = "https://cloud.oracle.com/monitoring/explore"; + private static final String DEFAULT_ADVANCED_MODE = "false"; + private static final String DEFAULT_AGGREGATE_METRICS = "false"; + + final String namespace; + final String region; + + public MetricsItem(String compartmentId, String name, String namespace, String region) { + super(OCID.of(null, "MetricsNamespace/Metrics"), compartmentId, name); + this.namespace = namespace; + this.region = region; + } + + public String getNamespace() { + return namespace; + } + + @Override + public URL getURL() { + StringBuilder sb = new StringBuilder(BASE_URL); + sb.append("?"); + sb.append("panelConfigs[0][advanced]=").append(DEFAULT_ADVANCED_MODE).append("&"); + sb.append("panelConfigs[0][content][aggregate]=").append(DEFAULT_AGGREGATE_METRICS).append("&"); + sb.append("panelConfigs[0][content][compartmentId]=").append(this.getCompartmentId()).append("&"); + sb.append("panelConfigs[0][content][metricName]=").append(this.getName()).append("&"); + sb.append("panelConfigs[0][content][namespace]=").append(this.getNamespace()).append("&"); + sb.append("panelConfigs[0][content][interval]=").append(DEFAULT_INTERVAL).append("&"); + sb.append("panelConfigs[0][content][statistic]=").append(DEFAULT_AGGREGATION_FUNCTION).append("&"); + sb.append("region=").append(this.region); + try { + return new URL(sb.toString()); + } catch (MalformedURLException ex) { + Exceptions.printStackTrace(ex); + } + return null; + } +} diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceItem.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceItem.java new file mode 100644 index 000000000000..e8ab68ead32f --- /dev/null +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceItem.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.cloud.oracle.developer; + +import org.netbeans.modules.cloud.oracle.items.OCID; +import org.netbeans.modules.cloud.oracle.items.OCIItem; + +/** + * + * @author Dusan Petrovic + */ +public class MetricsNamespaceItem extends OCIItem { + + public MetricsNamespaceItem(String compartmentId, String name) { + super(OCID.of(null, "MetricsNamespace"), compartmentId, name); + } + +} \ No newline at end of file diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceNode.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceNode.java new file mode 100644 index 000000000000..cb0701c5a8a1 --- /dev/null +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNamespaceNode.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.cloud.oracle.developer; + +import com.oracle.bmc.monitoring.MonitoringClient; +import com.oracle.bmc.monitoring.model.ListMetricsDetails; +import com.oracle.bmc.monitoring.requests.ListMetricsRequest; +import java.util.List; +import java.util.stream.Collectors; +import org.netbeans.modules.cloud.oracle.ChildrenProvider; +import org.netbeans.modules.cloud.oracle.NodeProvider; +import org.netbeans.modules.cloud.oracle.OCINode; +import org.netbeans.modules.cloud.oracle.compartment.CompartmentItem; +import org.openide.util.NbBundle; + +/** + * + * @author Dusan Petrovic + */ +@NbBundle.Messages({ + "MetricsNamespaceDesc=Metrics namespace" +}) +public class MetricsNamespaceNode extends OCINode { + + private static final String METRICS_NAMESPACE_ICON = "org/netbeans/modules/cloud/oracle/resources/metrics_namespace.svg"; // NOI18N + + public MetricsNamespaceNode(MetricsNamespaceItem instance) { + super(instance); + setName(instance.getName()); + setDisplayName(instance.getName()); + setIconBaseWithExtension(METRICS_NAMESPACE_ICON); + setShortDescription(Bundle.MetricsNamespaceDesc()); + } + + public static NodeProvider createNode() { + return MetricsNamespaceNode::new; + } + + /** + * Retrieves list of Metrics namespaces belonging to a given Compartment. + * + * @return Returns {@code ChildrenProvider} which fetches List of + * {@code BucketItem} for given {@code CompartmentItem} + */ + public static ChildrenProvider.SessionAware getMetricNamespaces() { + return (compartmentId, session) -> { + MonitoringClient client = session.newClient(MonitoringClient.class); + ListMetricsDetails listMetricsDetails = ListMetricsDetails.builder() + .groupBy(List.of("namespace")) + .build(); + + ListMetricsRequest request = ListMetricsRequest.builder() + .compartmentId(compartmentId.getKey().getValue()) + .listMetricsDetails(listMetricsDetails) + .build(); + + return client.listMetrics(request) + .getItems() + .stream() + .map(d -> new MetricsNamespaceItem( + compartmentId.getKey().getValue(), + d.getNamespace() + )) + .collect(Collectors.toList()); + }; + } +} + diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNode.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNode.java new file mode 100644 index 000000000000..cb4ed990ea98 --- /dev/null +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/developer/MetricsNode.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.cloud.oracle.developer; + +import com.oracle.bmc.monitoring.MonitoringClient; +import com.oracle.bmc.monitoring.model.ListMetricsDetails; +import com.oracle.bmc.monitoring.requests.ListMetricsRequest; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import org.netbeans.modules.cloud.oracle.ChildrenProvider; +import org.netbeans.modules.cloud.oracle.NodeProvider; +import org.netbeans.modules.cloud.oracle.OCINode; +import org.openide.nodes.Children; +import org.openide.util.NbBundle; + +/** + * + * @author Dusan Petrovic + */ +@NbBundle.Messages({ + "MetricsDesc=Namespace: {0}" +}) +public class MetricsNode extends OCINode { + + private static final String METRICS_ICON = "org/netbeans/modules/cloud/oracle/resources/metrics.svg"; // NOI18N + + public MetricsNode(MetricsItem instance) { + super(instance, Children.LEAF); + setName(instance.getName()); + setDisplayName(instance.getName()); + setIconBaseWithExtension(METRICS_ICON); + setShortDescription(Bundle.MetricsDesc(instance.getNamespace())); + } + + public static NodeProvider createNode() { + return MetricsNode::new; + } + + /** + * Retrieves list of Metrics belonging to a given Compartment. + * + * @return Returns {@code ChildrenProvider} which fetches List of + * {@code MetricsItem} for given {@code MetricsNamespaceItem} + */ + public static ChildrenProvider.SessionAware getMetrics() { + return (metricsNamespace, session) -> { + MonitoringClient client = session.newClient(MonitoringClient.class); + ListMetricsDetails listMetricsDetails = ListMetricsDetails.builder() + .namespace(metricsNamespace.getName()) + .build(); + + ListMetricsRequest request = ListMetricsRequest.builder() + .compartmentId(metricsNamespace.getCompartmentId()) + .listMetricsDetails(listMetricsDetails) + .build(); + + Set uniqueMetrics = new HashSet<>(); + + return client.listMetrics(request) + .getItems() + .stream() + .filter(m -> uniqueMetrics.add(m.getName())) + .map(d -> new MetricsItem( + d.getCompartmentId(), + d.getName(), + d.getNamespace(), + session.getRegion().getRegionId() + )) + .collect(Collectors.toList()); + }; + } +} diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/layer.xml b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/layer.xml index 5314e8831d6e..b94e8845be9f 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/layer.xml +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/layer.xml @@ -82,6 +82,9 @@ + + + @@ -215,6 +218,23 @@ + + + + + + + + + + + + + + + + + diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics.svg b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics.svg new file mode 100644 index 000000000000..d570c0b35339 --- /dev/null +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics.svg @@ -0,0 +1,133 @@ + + + + + + + + + diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics_namespace.svg b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics_namespace.svg new file mode 100644 index 000000000000..e5332be5d435 --- /dev/null +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/resources/metrics_namespace.svg @@ -0,0 +1,133 @@ + + + + + + + + + diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/ItemTypeStep.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/ItemTypeStep.java index 2e4235a076c9..f6ba58e879d7 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/ItemTypeStep.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/ItemTypeStep.java @@ -44,6 +44,7 @@ public class ItemTypeStep extends AbstractStep { put(Bundle.Bucket(), "Bucket"); //NOI18N put(Bundle.Vault(), "Vault"); //NOI18N put(Bundle.ContainerRepository(), "ContainerRepository"); //NOI18N + put(Bundle.MetricsNamespace(), "MetricsNamespace"); //NOI18N } }; private String selected; diff --git a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/SuggestedStep.java b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/SuggestedStep.java index 082b0823c658..8814a2cc0734 100644 --- a/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/SuggestedStep.java +++ b/enterprise/cloud.oracle/src/org/netbeans/modules/cloud/oracle/steps/SuggestedStep.java @@ -38,6 +38,7 @@ import org.netbeans.modules.cloud.oracle.compute.ComputeInstanceNode; import org.netbeans.modules.cloud.oracle.database.DatabaseNode; import org.netbeans.modules.cloud.oracle.developer.ContainerRepositoryNode; +import org.netbeans.modules.cloud.oracle.developer.MetricsNamespaceNode; import org.netbeans.modules.cloud.oracle.items.OCIItem; import org.netbeans.modules.cloud.oracle.vault.VaultNode; import org.openide.NotifyDescriptor; @@ -56,6 +57,7 @@ "Compute=Compute Instance", "SelectItem=Select {0}", "ContainerRepository=Container Repository", + "MetricsNamespace=Metrics Namespace", }) public class SuggestedStep extends AbstractStep { private static final Logger LOG = Logger.getLogger(SuggestedStep.class.getName()); @@ -92,6 +94,8 @@ private String getSuggestedItemName() { return Bundle.Compute(); case "ContainerRepository": return Bundle.ContainerRepository(); + case "MetricsNamespace": + return Bundle.MetricsNamespace(); } throw new MissingResourceException("Missing OCI type", null, suggestedType); } @@ -143,6 +147,8 @@ protected static List getItemsByPath(CompartmentItem parent, items.add(new CreateNewResourceItem()); items.addAll(ContainerRepositoryNode.getContainerRepositories().apply(parent)); return items; + case "MetricsNamespace": //NOI18N + return MetricsNamespaceNode.getMetricNamespaces().apply(parent); default: return Collections.emptyList(); } diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/cloud-cookies.contextValues b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/cloud-cookies.contextValues index e226eff2cce1..ec8d31fbfa0c 100644 --- a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/cloud-cookies.contextValues +++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/cloud-cookies.contextValues @@ -27,4 +27,6 @@ org.netbeans.modules.cloud.oracle.compute.ComputeInstanceItem org.netbeans.modules.cloud.oracle.bucket.BucketItem org.netbeans.modules.cloud.oracle.vault.VaultItem org.netbeans.modules.cloud.oracle.developer.ContainerRepositoryItem -org.netbeans.modules.cloud.oracle.developer.ContainerTagItem \ No newline at end of file +org.netbeans.modules.cloud.oracle.developer.ContainerTagItem +org.netbeans.modules.cloud.oracle.developer.MetricsNamespaceItem +org.netbeans.modules.cloud.oracle.developer.MetricsItem diff --git a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/layer.xml b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/layer.xml index 8141315be67c..95384806b0c3 100644 --- a/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/layer.xml +++ b/java/java.lsp.server/nbcode/integration/src/org/netbeans/modules/nbcode/integration/layer.xml @@ -62,6 +62,7 @@ + diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json index 159af73515d5..4444ddf56de6 100644 --- a/java/java.lsp.server/vscode/package.json +++ b/java/java.lsp.server/vscode/package.json @@ -564,6 +564,11 @@ "category": "Database", "icon": "$(add)" }, + { + "command": "nbls:Tools:org.netbeans.modules.cloud.oracle.adm.ShowInBrowserAction", + "title": "Open In Browser", + "icon": "$(link-external)" + }, { "command": "nbls.db.add.connection", "title": "Add JDBC Database Connection" @@ -859,6 +864,10 @@ "command": "nbls:Tools:org.netbeans.modules.cloud.oracle.actions.CreateBuildRun", "when": "false" }, + { + "command": "nbls:Tools:org.netbeans.modules.cloud.oracle.adm.ShowInBrowserAction", + "when": "false" + }, { "command": "nbls:Tools:org.netbeans.modules.cloud.oracle.actions.AddRepository", "when": "false" @@ -1072,6 +1081,11 @@ "when": "viewItem =~ /imageUrl:.*/", "group": "oci@1000" }, + { + "command": "nbls:Tools:org.netbeans.modules.cloud.oracle.adm.ShowInBrowserAction", + "when": "viewItem =~ /class:oracle.developer.MetricsItem/", + "group": "inline@10" + }, { "command": "nbls.cloud.computeInstance.ssh", "when": "viewItem =~ /publicIp:.*/ && viewItem =~ /^(?!.*imageUrl:).*/", @@ -1099,7 +1113,7 @@ }, { "command": "nbls:Tools:org.netbeans.modules.cloud.oracle.actions.AddToProject", - "when": "viewItem =~ /(ComputeInstanceItem|ClusterItem|BucketItem|DatabaseItem|VaultItem|ContainerRepositoryItem)/ && view != cloud.assets", + "when": "viewItem =~ /(ComputeInstanceItem|ClusterItem|BucketItem|DatabaseItem|VaultItem|ContainerRepositoryItem|MetricsNamespaceItem)/ && view != cloud.assets", "group": "inline@14" }, { @@ -1217,6 +1231,14 @@ "uriExpression": "nbres:/org/netbeans/modules/cloud/oracle/resources/bucket.svg", "codeicon": "archive" }, + { + "uriExpression": "nbres:/org/netbeans/modules/cloud/oracle/resources/metrics.svg", + "codeicon": "graph-line" + }, + { + "uriExpression": "nbres:/org/netbeans/modules/cloud/oracle/resources/metrics_namespace.svg", + "codeicon": "symbol-namespace" + }, { "uriExpression": "nbres:/org/netbeans/modules/cloud/oracle/resources/computeinstance.svg", "codeicon": "server-environment"