Skip to content

Commit badb23d

Browse files
Add utility for GSheets logger to stream output to Sheets (#1072)
1 parent 8792d14 commit badb23d

File tree

12 files changed

+651
-7
lines changed

12 files changed

+651
-7
lines changed

.gencode_hash.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ eeafb6e89a6c43816cfcb26244a95615a4ee75966e1c015cae5a13b6cfcb0078 gencode/docs/r
2323
741b880216be3743f6747800a042f2dbd89f3b0344c6b0a965f4bc010f03a930 gencode/docs/schema_doc.css
2424
878ea88206c974f40643c3cc430875f9c4e8c5e3fd6bcd6358bd3eb6d48699a9 gencode/docs/schema_doc.min.js
2525
7ed934930aee763e0beebc349725ba3909115e8d346bb762f28bcbe745bb163a gencode/docs/schema_extras.js
26-
0f16008af7116a182322736046b05c2718ac8b1f2cd755a60d28c9cfaeb6a8a9 gencode/docs/site_metadata.html
26+
0da2fca987af8f37f82e93b8b3fd8b954e4fe185bfe1e1f55adee5fe7f8024a9 gencode/docs/site_metadata.html
2727
1bbcbf2d1ec1bf4554846b1daf09fa09c08dd967fa1f91ebec93027662529a31 gencode/docs/state.html
2828
b2398e7f9e352c47867e38f97168f3eb88e23280c7dd576f13e038c8c3f714c9 gencode/docs/state_mapping.html
2929
b8ff4cdb4b79449166b1c6e09ac0e58273ae62865b47bf943fdd365739c62a4c gencode/docs/state_validation.html
@@ -121,7 +121,7 @@ fadf083200e73d46cfdec2f710d40e3d2bc4dbf05196e4d0900186e72b62d95e gencode/java/u
121121
ad70168de2e1801e26f2c1a8c33a6169e236682de59fd3f6038a77ac264aca14 gencode/java/udmi/schema/SequenceValidationState.java
122122
72e3a07ce890c73fccd3d0cf757d073746b60b722c94edd5425dc066951a048f gencode/java/udmi/schema/SetupUdmiConfig.java
123123
e5ce202bcf889287faa7d2d262d2f53f2241a10c659a83687de478803bdab127 gencode/java/udmi/schema/SetupUdmiState.java
124-
8fcb31df1070010da6d3ae61d741a77d2ce8b3757226bbe35ff9218a0581b1ec gencode/java/udmi/schema/SiteLinks.java
124+
2f802c738dd4c19211af8b6dec71b7659c51177c2774cfd34fc07e617bbe5b3e gencode/java/udmi/schema/SiteLinks.java
125125
a3dc7f14d4270ea370db2015785ad12d4bd61825213ab7ac4ee03dda21dde4f2 gencode/java/udmi/schema/SiteLocation.java
126126
4e51c21fcdb25e729258c428f55be4ac4909f526fdc3384734b6f5a87f1ef5cf gencode/java/udmi/schema/SiteMetadata.java
127127
dc2fd582fffefbdeaf3bf7724ca34e94475c3cc820891ea4cc829847eb9ba79d gencode/java/udmi/schema/State.java
@@ -213,7 +213,7 @@ d59671d0bc2ac184e820b70c277cdf91af0a936a60cdffd9b3af0ea314f08adc gencode/python
213213
6c5f3dd1c5ca9d821e3c48298af118fc7eafd97af9265dfd34b2ed8642efca77 gencode/python/udmi/schema/persistent_device.py
214214
a58f8c98e837a5b56126ca0f410e02f1e9cfcd80a8cb429e0ef522defab1f690 gencode/python/udmi/schema/properties.py
215215
a84e00db471b2038a473c2c83d72ea59b02c3d2bab56d38bc22435309f01e763 gencode/python/udmi/schema/query_cloud.py
216-
d42bae60bd667cda893d3670896ed087f20df629635949cf418ee9be2e975347 gencode/python/udmi/schema/site_metadata.py
216+
77bcd0622552871b9b1543f26c4fe961955813f64a8702f4efe894fba91ce116 gencode/python/udmi/schema/site_metadata.py
217217
e604cf0280fe772de5f4e5ecf10dc6c564b6177eeff9cd9fb8b385af8fe10a95 gencode/python/udmi/schema/state.py
218218
4a908cee3fb8afb559bcbfa594e57dbc515a35e4468e02600751b2fcce05a238 gencode/python/udmi/schema/state_blobset.py
219219
182e07b534403dcc121d980672e41b0fa2ee55c4da1f5c56f0dad5d599450c80 gencode/python/udmi/schema/state_blobset_blob.py

bin/toolrun

+19-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,22 @@ fi
2828

2929
cmd="java -cp $UDMI_JAR $JDWP $JAVA_CLASS $util_name $@"
3030
echo $cmd
31-
$cmd 2>&1 | tee $OUT_DIR/$util_name.log
31+
32+
site_path=$(realpath "$1")
33+
if [[ ! -d $site_path ]]; then
34+
site_path=$(dirname "$site_path")
35+
fi
36+
37+
if [[ -e "$site_path/site_metadata.json" ]]; then
38+
spreadsheet=$(jq -r '.sheet' "$site_path/site_metadata.json")
39+
else
40+
spreadsheet=
41+
fi
42+
43+
if [[ $spreadsheet != "null" && -n "$spreadsheet" ]]; then
44+
spreadsheet_id=$(echo "$spreadsheet" | grep -oP '(?<=/d/)[^/]+')
45+
echo "Streaming logs to gsheet id $spreadsheet_id"
46+
$cmd 2>&1 | tee $OUT_DIR/$util_name.log | stream_to_gsheets "$util_name" "$spreadsheet_id"
47+
else
48+
$cmd 2>&1 | tee $OUT_DIR/$util_name.log
49+
fi

etc/shell_common.sh

+8
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,11 @@ export UDMI_VERSION=$udmi_version
104104
export UDMI_COMMIT=$udmi_commit
105105
export UDMI_TIMEVER=$udmi_timever
106106
export UDMI_REV=$udmi_rev
107+
108+
function stream_to_gsheets {
109+
local tool_name=$1
110+
local sheet_id=$2
111+
timestamp=$(date +%Y%m%d_%H%M%S)
112+
java -cp "$UDMI_JAR" "com.google.udmi.util.SheetsOutputStream" "$tool_name" \
113+
"$sheet_id" "$tool_name.$timestamp.log"
114+
}

gencode/docs/site_metadata.html

+45
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gencode/java/udmi/schema/SiteLinks.java

+12-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gencode/python/udmi/schema/site_metadata.py

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

schema/site_metadata.json

+5
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@
9292
"description": "Source repository where the UDMI site model is stored",
9393
"type": "string",
9494
"examples": ["https://github.com/faucetsdn/udmi_site_model", "git@github.com:faucetsdn/udmi_site_model.git"]
95+
},
96+
"sheet": {
97+
"description": "Link to a spreadsheet to observe real-time output from any tool",
98+
"type": "string",
99+
"examples": ["https://docs.google.com/spreadsheets/d/<spreadsheet_id>"]
95100
}
96101
}
97102
},

udmis/build.gradle

+3
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,7 @@ dependencies {
111111
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
112112
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.2'
113113
testImplementation 'org.mockito:mockito-core:5.3.1'
114+
115+
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0'
116+
implementation 'com.google.apis:google-api-services-sheets:v4-rev484-1.20.0'
114117
}

validator/build.gradle

+8
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,12 @@ dependencies {
104104
implementation 'com.google.cloud:google-cloud-firestore:0.84.0-beta'
105105
implementation group: 'junit', name: 'junit', version: '4.13.2'
106106
implementation 'org.jetbrains:annotations:20.1.0'
107+
108+
implementation 'com.google.oauth-client:google-oauth-client-jetty:1.20.0'
109+
implementation 'com.google.apis:google-api-services-sheets:v4-rev484-1.20.0'
110+
111+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2'
112+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.2'
113+
testImplementation 'org.mockito:mockito-core:5.3.1'
114+
testImplementation 'org.mockito:mockito-junit-jupiter:5.6.0'
107115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.google.udmi.util;
2+
3+
import java.io.IOException;
4+
import java.io.OutputStream;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
/**
8+
* An OutputStream that duplicates output to two output streams, useful for scenarios such as
9+
* logging to two destinations simultaneously.
10+
*/
11+
public class DualOutputStream extends OutputStream {
12+
13+
private final OutputStream primary;
14+
private final OutputStream secondary;
15+
16+
public DualOutputStream(OutputStream primary, OutputStream secondary) {
17+
this.primary = primary;
18+
this.secondary = secondary;
19+
}
20+
21+
@Override
22+
public void write(int i) throws IOException {
23+
primary.write(i);
24+
secondary.write(i);
25+
}
26+
27+
@Override
28+
public void write(byte @NotNull [] b) throws IOException {
29+
primary.write(b);
30+
secondary.write(b);
31+
}
32+
33+
@Override
34+
public void write(byte @NotNull [] b, int off, int len) throws IOException {
35+
primary.write(b, off, len);
36+
secondary.write(b, off, len);
37+
}
38+
39+
@Override
40+
public void flush() throws IOException {
41+
primary.flush();
42+
secondary.flush();
43+
}
44+
45+
@Override
46+
public void close() throws IOException {
47+
primary.close();
48+
secondary.close();
49+
}
50+
}

0 commit comments

Comments
 (0)