From 7e59bf3c3676ebc6bfcdf6e951d3d8f0b6c1589f Mon Sep 17 00:00:00 2001 From: Mridula <66699525+mpeddada1@users.noreply.github.com> Date: Tue, 8 Mar 2022 16:31:24 -0500 Subject: [PATCH] docs(sample): Add sample for Native Image support in Logging (#880) * docs(sample): Add sample for Native Image support --- README.md | 1 + samples/native-image-sample/README.md | 71 ++++++++ samples/native-image-sample/pom.xml | 170 ++++++++++++++++++ .../logging/NativeImageLoggingSample.java | 64 +++++++ .../logging/ITNativeImageLoggingSample.java | 35 ++++ samples/pom.xml | 1 + 6 files changed, 342 insertions(+) create mode 100644 samples/native-image-sample/README.md create mode 100644 samples/native-image-sample/pom.xml create mode 100644 samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java create mode 100644 samples/native-image-sample/src/test/java/com/example/logging/ITNativeImageLoggingSample.java diff --git a/README.md b/README.md index c343b944a..1438e1d24 100644 --- a/README.md +++ b/README.md @@ -302,6 +302,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-logging/tree/ | Sample | Source Code | Try it | | --------------------------- | --------------------------------- | ------ | +| Native Image Logging Sample | [source code](https://github.com/googleapis/java-logging/blob/main/samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-logging&page=editor&open_in_editor=samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java) | | Get Sink Metadata | [source code](https://github.com/googleapis/java-logging/blob/main/samples/snippets/src/main/java/com/example/logging/GetSinkMetadata.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-logging&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/GetSinkMetadata.java) | | List Log Entries | [source code](https://github.com/googleapis/java-logging/blob/main/samples/snippets/src/main/java/com/example/logging/ListLogEntries.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-logging&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/ListLogEntries.java) | | List Logs | [source code](https://github.com/googleapis/java-logging/blob/main/samples/snippets/src/main/java/com/example/logging/ListLogs.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-logging&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/logging/ListLogs.java) | diff --git a/samples/native-image-sample/README.md b/samples/native-image-sample/README.md new file mode 100644 index 000000000..398a55e83 --- /dev/null +++ b/samples/native-image-sample/README.md @@ -0,0 +1,71 @@ +# Cloud Logging Client Libraries with Native Image + +This application uses the Google Cloud [Logging Client Libraries](https://github.com/googleapis/java-logging) and can be compiled with Native Image Native Image. + +## Setup Instructions + +You will need to follow these prerequisite steps in order to run the samples: + +1. If you have not already, [create a Google Cloud Platform Project](https://cloud.google.com/resource-manager/docs/creating-managing-projects#creating_a_project). + +2. Install the [Google Cloud SDK](https://cloud.google.com/sdk/) which will allow you to run the sample with your project's credentials. + + Once installed, log in with Application Default Credentials using the following command: + + ``` + gcloud auth application-default login + ``` + + **Note:** Authenticating with Application Default Credentials is convenient to use during development, but we recommend [alternate methods of authentication](https://cloud.google.com/docs/authentication/production) during production use. + +3. Install the GraalVM compiler. + + You can follow the [official installation instructions](https://www.graalvm.org/docs/getting-started/#install-graalvm) from the GraalVM website. + After following the instructions, ensure that you install the native image extension installed by running: + + ``` + gu install native-image + ``` + + Once you finish following the instructions, verify that the default version of Java is set to the GraalVM version by running `java -version` in a terminal. + + You will see something similar to the below output: + + ``` + $ java -version + + openjdk version "11.0.7" 2020-04-14 + OpenJDK Runtime Environment GraalVM CE 20.1.0 (build 11.0.7+10-jvmci-20.1-b02) + OpenJDK 64-Bit Server VM GraalVM CE 20.1.0 (build 11.0.7+10-jvmci-20.1-b02, mixed mode, sharing) + ``` + +4. Enable the [Logging APIs](https://console.cloud.google.com/flows/enableapi?apiid=logging.googleapis.com). + +## Sample + +Navigate to this directory in a new terminal. + +1. Compile the application using the Native Image Compiler. This step may take a few minutes. + + ``` + mvn package -P native -DskipTests + ``` + +2. Run the application: + + ``` + ./target/native-image-sample + ``` + +3. The application will log a message to your local terminal and to Google Cloud Console. + + Navigate to the [Cloud Console Logs Viewer](https://console.cloud.google.com/logs/viewer) to view you logs and find the newly generated log entry in Cloud Console: + ``` + This is a log produced by Native Image. + ``` +### Sample Integration test with Native Image Support +In order to run the sample integration test as a native image, call the following command: + + ``` + mvn test -Pnative + ``` \ No newline at end of file diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml new file mode 100644 index 000000000..afc30a7ec --- /dev/null +++ b/samples/native-image-sample/pom.xml @@ -0,0 +1,170 @@ + + + + 4.0.0 + com.example.logging + native-image-sample + Native Image Sample + https://github.com/googleapis/java-logging + + + + com.google.cloud.samples + shared-configuration + 1.2.0 + + + + + 1.8 + 1.8 + UTF-8 + + + + + + com.google.cloud + libraries-bom + 24.3.0 + pom + import + + + + + + + com.google.cloud + google-cloud-logging + + + + junit + junit + 4.13.2 + test + + + com.google.truth + truth + 1.1.3 + test + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.2 + + + + true + dependency-jars/ + com.example.logging.NativeImageLoggingSample + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.2.0 + + + copy-dependencies + package + + copy-dependencies + + + + ${project.build.directory}/dependency-jars/ + + + + + + + + + + + + native + + + + com.google.cloud + native-image-support + 0.12.0 + + + org.junit.vintage + junit-vintage-engine + 5.8.2 + test + + + org.graalvm.buildtools + junit-platform-native + 0.9.9 + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 2.22.2 + + + **/IT* + + + + + org.graalvm.buildtools + native-maven-plugin + 0.9.9 + true + + com.example.logging.NativeImageLoggingSample + + --no-fallback + --no-server + + + + + build-native + + build + test + + package + + + test-native + + test + + test + + + + + + + + \ No newline at end of file diff --git a/samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java b/samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java new file mode 100644 index 000000000..6fa688060 --- /dev/null +++ b/samples/native-image-sample/src/main/java/com/example/logging/NativeImageLoggingSample.java @@ -0,0 +1,64 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed 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 + * + * https://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 com.example.logging; + +import com.google.cloud.MonitoredResource; +import com.google.cloud.logging.LogEntry; +import com.google.cloud.logging.Logging; +import com.google.cloud.logging.LoggingOptions; +import com.google.cloud.logging.Payload.StringPayload; +import com.google.cloud.logging.Severity; +import java.time.Duration; +import java.time.Instant; +import java.util.Collections; + +/** Basic sample application which writes a log message to Cloud Logging. */ +public class NativeImageLoggingSample { + + /** Runs the Logging Sample Application. */ + public static void main(String[] args) throws Exception { + Instant startTime = Instant.now(); + // Instantiates a client + Logging client = LoggingOptions.getDefaultInstance().getService(); + + // The name of the log to write to + String logName = "nativeimage_logging_sample.log"; + + // The data to write to the log + String text = "This is a log produced by Native Image."; + + LogEntry entry = + LogEntry.newBuilder(StringPayload.of(text)) + .setSeverity(Severity.INFO) + .setLogName(logName) + .setResource(MonitoredResource.newBuilder("global").build()) + .build(); + + client.write(Collections.singleton(entry)); + client.flush(); + client.close(); + + System.out.println(String.format("Logged: %s", text)); + System.out.println("Log message written to Cloud Logging."); + System.out.println( + "See your logs in the Cloud Console: https://console.cloud.google.com/logs/viewer " + + "(Might take a few seconds to load.)"); + Instant endTime = Instant.now(); + Duration duration = Duration.between(startTime, endTime); + System.out.println("Duration: " + duration.toString()); + } +} diff --git a/samples/native-image-sample/src/test/java/com/example/logging/ITNativeImageLoggingSample.java b/samples/native-image-sample/src/test/java/com/example/logging/ITNativeImageLoggingSample.java new file mode 100644 index 000000000..6a4ba67ca --- /dev/null +++ b/samples/native-image-sample/src/test/java/com/example/logging/ITNativeImageLoggingSample.java @@ -0,0 +1,35 @@ +/* + * Copyright 2022 Google LLC + * + * Licensed 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 + * + * https://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 com.example.logging; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.cloud.testing.junit4.StdOutCaptureRule; +import org.junit.Rule; +import org.junit.Test; + +public class ITNativeImageLoggingSample { + + @Rule public StdOutCaptureRule stdOut = new StdOutCaptureRule(); + + @Test + public void testLogging() throws Exception { + NativeImageLoggingSample.main(new String[] {}); + assertThat(stdOut.getCapturedOutputAsUtf8String()) + .contains("Logged: This is a log produced by Native Image."); + } +} diff --git a/samples/pom.xml b/samples/pom.xml index b086c0e56..72d7759f9 100644 --- a/samples/pom.xml +++ b/samples/pom.xml @@ -31,6 +31,7 @@ snapshot install-without-bom snippets + native-image-sample