embulk-input-cloudwatch_logs 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,5 @@
1
+ distributionBase=GRADLE_USER_HOME
2
+ distributionPath=wrapper/dists
3
+ distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip
4
+ zipStoreBase=GRADLE_USER_HOME
5
+ zipStorePath=wrapper/dists
data/gradlew ADDED
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env sh
2
+
3
+ #
4
+ # Copyright 2015 the original author or authors.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # https://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ ##############################################################################
20
+ ##
21
+ ## Gradle start up script for UN*X
22
+ ##
23
+ ##############################################################################
24
+
25
+ # Attempt to set APP_HOME
26
+ # Resolve links: $0 may be a link
27
+ PRG="$0"
28
+ # Need this for relative symlinks.
29
+ while [ -h "$PRG" ] ; do
30
+ ls=`ls -ld "$PRG"`
31
+ link=`expr "$ls" : '.*-> \(.*\)$'`
32
+ if expr "$link" : '/.*' > /dev/null; then
33
+ PRG="$link"
34
+ else
35
+ PRG=`dirname "$PRG"`"/$link"
36
+ fi
37
+ done
38
+ SAVED="`pwd`"
39
+ cd "`dirname \"$PRG\"`/" >/dev/null
40
+ APP_HOME="`pwd -P`"
41
+ cd "$SAVED" >/dev/null
42
+
43
+ APP_NAME="Gradle"
44
+ APP_BASE_NAME=`basename "$0"`
45
+
46
+ # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47
+ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48
+
49
+ # Use the maximum available, or set MAX_FD != -1 to use that value.
50
+ MAX_FD="maximum"
51
+
52
+ warn () {
53
+ echo "$*"
54
+ }
55
+
56
+ die () {
57
+ echo
58
+ echo "$*"
59
+ echo
60
+ exit 1
61
+ }
62
+
63
+ # OS specific support (must be 'true' or 'false').
64
+ cygwin=false
65
+ msys=false
66
+ darwin=false
67
+ nonstop=false
68
+ case "`uname`" in
69
+ CYGWIN* )
70
+ cygwin=true
71
+ ;;
72
+ Darwin* )
73
+ darwin=true
74
+ ;;
75
+ MINGW* )
76
+ msys=true
77
+ ;;
78
+ NONSTOP* )
79
+ nonstop=true
80
+ ;;
81
+ esac
82
+
83
+ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84
+
85
+ # Determine the Java command to use to start the JVM.
86
+ if [ -n "$JAVA_HOME" ] ; then
87
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88
+ # IBM's JDK on AIX uses strange locations for the executables
89
+ JAVACMD="$JAVA_HOME/jre/sh/java"
90
+ else
91
+ JAVACMD="$JAVA_HOME/bin/java"
92
+ fi
93
+ if [ ! -x "$JAVACMD" ] ; then
94
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95
+
96
+ Please set the JAVA_HOME variable in your environment to match the
97
+ location of your Java installation."
98
+ fi
99
+ else
100
+ JAVACMD="java"
101
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102
+
103
+ Please set the JAVA_HOME variable in your environment to match the
104
+ location of your Java installation."
105
+ fi
106
+
107
+ # Increase the maximum file descriptors if we can.
108
+ if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109
+ MAX_FD_LIMIT=`ulimit -H -n`
110
+ if [ $? -eq 0 ] ; then
111
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112
+ MAX_FD="$MAX_FD_LIMIT"
113
+ fi
114
+ ulimit -n $MAX_FD
115
+ if [ $? -ne 0 ] ; then
116
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
117
+ fi
118
+ else
119
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120
+ fi
121
+ fi
122
+
123
+ # For Darwin, add options to specify how the application appears in the dock
124
+ if $darwin; then
125
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126
+ fi
127
+
128
+ # For Cygwin or MSYS, switch paths to Windows format before running java
129
+ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
130
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132
+ JAVACMD=`cygpath --unix "$JAVACMD"`
133
+
134
+ # We build the pattern for arguments to be converted via cygpath
135
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136
+ SEP=""
137
+ for dir in $ROOTDIRSRAW ; do
138
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
139
+ SEP="|"
140
+ done
141
+ OURCYGPATTERN="(^($ROOTDIRS))"
142
+ # Add a user-defined pattern to the cygpath arguments
143
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145
+ fi
146
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
147
+ i=0
148
+ for arg in "$@" ; do
149
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151
+
152
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154
+ else
155
+ eval `echo args$i`="\"$arg\""
156
+ fi
157
+ i=`expr $i + 1`
158
+ done
159
+ case $i in
160
+ 0) set -- ;;
161
+ 1) set -- "$args0" ;;
162
+ 2) set -- "$args0" "$args1" ;;
163
+ 3) set -- "$args0" "$args1" "$args2" ;;
164
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170
+ esac
171
+ fi
172
+
173
+ # Escape application args
174
+ save () {
175
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176
+ echo " "
177
+ }
178
+ APP_ARGS=`save "$@"`
179
+
180
+ # Collect all arguments for the java command, following the shell quoting and substitution rules
181
+ eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182
+
183
+ exec "$JAVACMD" "$@"
data/gradlew.bat ADDED
@@ -0,0 +1,103 @@
1
+ @rem
2
+ @rem Copyright 2015 the original author or authors.
3
+ @rem
4
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
5
+ @rem you may not use this file except in compliance with the License.
6
+ @rem You may obtain a copy of the License at
7
+ @rem
8
+ @rem https://www.apache.org/licenses/LICENSE-2.0
9
+ @rem
10
+ @rem Unless required by applicable law or agreed to in writing, software
11
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
12
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ @rem See the License for the specific language governing permissions and
14
+ @rem limitations under the License.
15
+ @rem
16
+
17
+ @if "%DEBUG%" == "" @echo off
18
+ @rem ##########################################################################
19
+ @rem
20
+ @rem Gradle startup script for Windows
21
+ @rem
22
+ @rem ##########################################################################
23
+
24
+ @rem Set local scope for the variables with windows NT shell
25
+ if "%OS%"=="Windows_NT" setlocal
26
+
27
+ set DIRNAME=%~dp0
28
+ if "%DIRNAME%" == "" set DIRNAME=.
29
+ set APP_BASE_NAME=%~n0
30
+ set APP_HOME=%DIRNAME%
31
+
32
+ @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33
+ for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34
+
35
+ @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36
+ set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37
+
38
+ @rem Find java.exe
39
+ if defined JAVA_HOME goto findJavaFromJavaHome
40
+
41
+ set JAVA_EXE=java.exe
42
+ %JAVA_EXE% -version >NUL 2>&1
43
+ if "%ERRORLEVEL%" == "0" goto init
44
+
45
+ echo.
46
+ echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47
+ echo.
48
+ echo Please set the JAVA_HOME variable in your environment to match the
49
+ echo location of your Java installation.
50
+
51
+ goto fail
52
+
53
+ :findJavaFromJavaHome
54
+ set JAVA_HOME=%JAVA_HOME:"=%
55
+ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56
+
57
+ if exist "%JAVA_EXE%" goto init
58
+
59
+ echo.
60
+ echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61
+ echo.
62
+ echo Please set the JAVA_HOME variable in your environment to match the
63
+ echo location of your Java installation.
64
+
65
+ goto fail
66
+
67
+ :init
68
+ @rem Get command-line arguments, handling Windows variants
69
+
70
+ if not "%OS%" == "Windows_NT" goto win9xME_args
71
+
72
+ :win9xME_args
73
+ @rem Slurp the command line arguments.
74
+ set CMD_LINE_ARGS=
75
+ set _SKIP=2
76
+
77
+ :win9xME_args_slurp
78
+ if "x%~1" == "x" goto execute
79
+
80
+ set CMD_LINE_ARGS=%*
81
+
82
+ :execute
83
+ @rem Setup the command line
84
+
85
+ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
86
+
87
+ @rem Execute Gradle
88
+ "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
89
+
90
+ :end
91
+ @rem End local scope for the variables with windows NT shell
92
+ if "%ERRORLEVEL%"=="0" goto mainEnd
93
+
94
+ :fail
95
+ rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
96
+ rem the _cmd.exe /c_ return code!
97
+ if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
98
+ exit /b 1
99
+
100
+ :mainEnd
101
+ if "%OS%"=="Windows_NT" endlocal
102
+
103
+ :omega
@@ -0,0 +1,3 @@
1
+ Embulk::JavaPlugin.register_input(
2
+ "cloudwatch_logs", "org.embulk.input.cloudwatch_logs.CloudwatchLogsInputPlugin",
3
+ File.expand_path('../../../../classpath', __FILE__))
@@ -0,0 +1,336 @@
1
+ package org.embulk.input.cloudwatch_logs;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.Collections;
5
+ import java.util.Date;
6
+ import java.util.List;
7
+
8
+ import com.google.common.base.Optional;
9
+ import com.google.common.annotations.VisibleForTesting;
10
+
11
+ import org.embulk.config.Config;
12
+ import org.embulk.config.ConfigDefault;
13
+ import org.embulk.config.ConfigDiff;
14
+ import org.embulk.config.ConfigException;
15
+ import org.embulk.config.ConfigSource;
16
+ import org.embulk.config.Task;
17
+ import org.embulk.config.TaskReport;
18
+ import org.embulk.config.TaskSource;
19
+ import org.embulk.spi.Exec;
20
+ import org.embulk.spi.InputPlugin;
21
+ import org.embulk.spi.PageBuilder;
22
+ import org.embulk.spi.PageOutput;
23
+ import org.embulk.spi.Schema;
24
+ import org.embulk.spi.SchemaConfig;
25
+ import org.embulk.spi.time.Timestamp;
26
+ import org.embulk.spi.type.Types;
27
+ import org.embulk.spi.util.RetryExecutor;
28
+
29
+ import com.amazonaws.AmazonServiceException;
30
+ import com.amazonaws.ClientConfiguration;
31
+ import com.amazonaws.Protocol;
32
+ import com.amazonaws.auth.AWSCredentialsProvider;
33
+ import com.amazonaws.retry.PredefinedRetryPolicies;
34
+
35
+ import com.amazonaws.services.logs.AWSLogsClient;
36
+ import com.amazonaws.services.logs.AWSLogsClientBuilder;
37
+ import com.amazonaws.services.logs.AWSLogs;
38
+ import com.amazonaws.services.logs.model.DescribeLogStreamsRequest;
39
+ import com.amazonaws.services.logs.model.DescribeLogStreamsResult;
40
+ import com.amazonaws.services.logs.model.LogStream;
41
+ import com.amazonaws.services.logs.model.GetLogEventsRequest;
42
+ import com.amazonaws.services.logs.model.GetLogEventsResult;
43
+ import com.amazonaws.services.logs.model.OutputLogEvent;
44
+
45
+ import org.embulk.input.cloudwatch_logs.aws.AwsCredentials;
46
+ import org.embulk.input.cloudwatch_logs.aws.AwsCredentialsTask;
47
+ import org.embulk.input.cloudwatch_logs.utils.DateUtils;
48
+
49
+ public abstract class AbstractCloudwatchLogsInputPlugin
50
+ implements InputPlugin
51
+ {
52
+ private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
53
+
54
+ public interface PluginTask
55
+ extends AwsCredentialsTask, Task
56
+ {
57
+ @Config("log_group_name")
58
+ public String getLogGroupName();
59
+
60
+ @Config("log_stream_name")
61
+ @ConfigDefault("null")
62
+ public Optional<String> getLogStreamName();
63
+
64
+ @Config("use_log_stream_name_prefix")
65
+ @ConfigDefault("false")
66
+ public boolean getUseLogStreamNamePrefix();
67
+
68
+ @Config("start_time")
69
+ @ConfigDefault("null")
70
+ public Optional<String> getStartTime();
71
+
72
+ @Config("end_time")
73
+ @ConfigDefault("null")
74
+ public Optional<String> getEndTime();
75
+
76
+ @Config("time_range_format")
77
+ @ConfigDefault("null")
78
+ public Optional<String> getTimeRangeFormat();
79
+
80
+ @Config("column_name")
81
+ @ConfigDefault("\"message\"")
82
+ public String getColumnName();
83
+ }
84
+
85
+ protected abstract Class<? extends PluginTask> getTaskClass();
86
+
87
+ @Override
88
+ public ConfigDiff transaction(ConfigSource config,
89
+ InputPlugin.Control control)
90
+ {
91
+ PluginTask task = config.loadConfig(getTaskClass());
92
+
93
+ Schema schema = new Schema.Builder()
94
+ .add("timestamp", Types.TIMESTAMP)
95
+ .add(task.getColumnName(), Types.STRING)
96
+ .build();
97
+ int taskCount = 1; // number of run() method calls
98
+ String time_range_format = DEFAULT_DATE_FORMAT;
99
+ if (task.getTimeRangeFormat().isPresent()) {
100
+ time_range_format = task.getTimeRangeFormat().get();
101
+ }
102
+ if (task.getStartTime().isPresent() && task.getEndTime().isPresent()) {
103
+ Date startTime = DateUtils.parseDateStr(task.getStartTime().get(),
104
+ Collections.singletonList(time_range_format));
105
+ Date endTime = DateUtils.parseDateStr(task.getEndTime().get(),
106
+ Collections.singletonList(time_range_format));
107
+ if (endTime.before(startTime)) {
108
+ throw new ConfigException(String.format("endTime(%s) must not be earlier than startTime(%s).",
109
+ task.getEndTime().get(),
110
+ task.getStartTime().get()));
111
+ }
112
+ }
113
+
114
+ return resume(task.dump(), schema, taskCount, control);
115
+ }
116
+
117
+ @Override
118
+ public ConfigDiff resume(TaskSource taskSource,
119
+ Schema schema, int taskCount,
120
+ InputPlugin.Control control)
121
+ {
122
+ control.run(taskSource, schema, taskCount);
123
+ return Exec.newConfigDiff();
124
+ }
125
+
126
+ @Override
127
+ public void cleanup(TaskSource taskSource,
128
+ Schema schema, int taskCount,
129
+ List<TaskReport> successTaskReports)
130
+ {
131
+ // Do nothing.
132
+ }
133
+
134
+ @Override
135
+ public TaskReport run(TaskSource taskSource,
136
+ Schema schema, int taskIndex,
137
+ PageOutput output)
138
+ {
139
+ PluginTask task = taskSource.loadTask(getTaskClass());
140
+
141
+ AWSLogs client = newLogsClient(task);
142
+ CloudWatchLogsDrainer drainer = new CloudWatchLogsDrainer(task, client);
143
+ if (task.getUseLogStreamNamePrefix()) {
144
+ List<LogStream> defaultLogStream = new ArrayList<LogStream>();
145
+ List<LogStream> logStreams = drainer.describeLogStreams(defaultLogStream, null);
146
+ String nextToken = null;
147
+ try (final PageBuilder pageBuilder = getPageBuilder(schema, output)) {
148
+ for (LogStream stream : logStreams) {
149
+ String logStreamName = stream.getLogStreamName();
150
+ GetLogEventsResult result = drainer.getEvents(logStreamName, nextToken);
151
+ List<OutputLogEvent> events = result.getEvents();
152
+ for (OutputLogEvent event : events) {
153
+ pageBuilder.setTimestamp(0, Timestamp.ofEpochMilli(event.getTimestamp()));
154
+ pageBuilder.setString(1, event.getMessage());
155
+
156
+ pageBuilder.addRecord();
157
+ }
158
+ nextToken = result.getNextForwardToken();
159
+ }
160
+
161
+ pageBuilder.finish();
162
+ }
163
+ }
164
+ else {
165
+ try (final PageBuilder pageBuilder = getPageBuilder(schema, output)) {
166
+ String logStreamName = null;
167
+ if (task.getLogStreamName().isPresent()) {
168
+ logStreamName = task.getLogStreamName().get();
169
+ }
170
+ GetLogEventsResult result = drainer.getEvents(logStreamName, null);
171
+ List<OutputLogEvent> events = result.getEvents();
172
+ for (OutputLogEvent event : events) {
173
+ pageBuilder.setTimestamp(0, Timestamp.ofEpochMilli(event.getTimestamp()));
174
+ pageBuilder.setString(1, event.getMessage());
175
+
176
+ pageBuilder.addRecord();
177
+ }
178
+
179
+ pageBuilder.finish();
180
+ }
181
+ }
182
+
183
+ return Exec.newTaskReport();
184
+ }
185
+
186
+ /**
187
+ * Provide an overridable default client.
188
+ * Since this returns an immutable object, it is not for any further customizations by mutating,
189
+ * Subclass's customization should be done through {@link AbstractCloudwatchLogsInputPlugin#defaultLogsClientBuilder}.
190
+ * @param task Embulk plugin task
191
+ * @return AWSLogs
192
+ */
193
+ protected AWSLogs newLogsClient(PluginTask task)
194
+ {
195
+ return defaultLogsClientBuilder(task).build();
196
+ }
197
+
198
+ /**
199
+ * A base builder for the subclasses to then customize.builder
200
+ * @param task Embulk plugin
201
+ * @return AWSLogsClientBuilder
202
+ **/
203
+ protected AWSLogsClientBuilder defaultLogsClientBuilder(PluginTask task)
204
+ {
205
+ return AWSLogsClientBuilder
206
+ .standard()
207
+ .withCredentials(getCredentialsProvider(task))
208
+ .withClientConfiguration(getClientConfiguration(task));
209
+ }
210
+
211
+ protected AWSCredentialsProvider getCredentialsProvider(PluginTask task)
212
+ {
213
+ return AwsCredentials.getAWSCredentialsProvider(task);
214
+ }
215
+
216
+ protected ClientConfiguration getClientConfiguration(PluginTask task)
217
+ {
218
+ ClientConfiguration clientConfig = new ClientConfiguration();
219
+
220
+ //clientConfig.setProtocol(Protocol.HTTP);
221
+ clientConfig.setMaxConnections(50); // SDK default: 50
222
+ // clientConfig.setMaxErrorRetry(3); // SDK default: 3
223
+ clientConfig.setSocketTimeout(8 * 60 * 1000); // SDK default: 50*1000
224
+ clientConfig.setRetryPolicy(PredefinedRetryPolicies.NO_RETRY_POLICY);
225
+ // TODO: implement http proxy
226
+
227
+ return clientConfig;
228
+ }
229
+
230
+ @Override
231
+ public ConfigDiff guess(ConfigSource config)
232
+ {
233
+ return Exec.newConfigDiff();
234
+ }
235
+
236
+ @VisibleForTesting
237
+ public PageBuilder getPageBuilder(final Schema schema, final PageOutput output)
238
+ {
239
+ return new PageBuilder(Exec.getBufferAllocator(), schema, output);
240
+ }
241
+
242
+ @VisibleForTesting
243
+ static class CloudWatchLogsDrainer
244
+ {
245
+ private final AWSLogs client;
246
+ private final PluginTask task;
247
+
248
+ public CloudWatchLogsDrainer(PluginTask task, AWSLogs client)
249
+ {
250
+ this.client = client;
251
+ this.task = task;
252
+ }
253
+
254
+ private GetLogEventsResult getEvents(String logStreamName, String nextToken)
255
+ {
256
+ try {
257
+ String logGroupName = task.getLogGroupName();
258
+ GetLogEventsRequest request = new GetLogEventsRequest()
259
+ .withLogGroupName(logGroupName)
260
+ .withLogStreamName(logStreamName);
261
+ String time_range_format = DEFAULT_DATE_FORMAT;
262
+ if (task.getTimeRangeFormat().isPresent()) {
263
+ time_range_format = task.getTimeRangeFormat().get();
264
+ }
265
+ if (task.getStartTime().isPresent()) {
266
+ String startTimeStr = task.getStartTime().get();
267
+ Date startTime = DateUtils.parseDateStr(startTimeStr, Collections.singletonList(time_range_format));
268
+ request.setStartTime(startTime.getTime());
269
+ }
270
+ if (task.getEndTime().isPresent()) {
271
+ String endTimeStr = task.getEndTime().get();
272
+ Date endTime = DateUtils.parseDateStr(endTimeStr, Collections.singletonList(time_range_format));
273
+ request.setEndTime(endTime.getTime());
274
+ }
275
+ if (nextToken != null) {
276
+ request.setNextToken(nextToken);
277
+ }
278
+ GetLogEventsResult response = client.getLogEvents(request);
279
+
280
+ return response;
281
+ }
282
+ catch (AmazonServiceException ex) {
283
+ if (ex.getErrorType().equals(AmazonServiceException.ErrorType.Client)) {
284
+ // HTTP 40x errors. auth error etc. See AWS document for the full list:
285
+ // https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CommonErrors.html
286
+ if (ex.getStatusCode() != 400 // 404 Bad Request is unexpected error
287
+ || "ExpiredToken".equalsIgnoreCase(ex.getErrorCode())) { // if statusCode == 400 && errorCode == ExpiredToken => throws ConfigException
288
+ throw new ConfigException(ex);
289
+ }
290
+ }
291
+ throw ex;
292
+ }
293
+ }
294
+
295
+ private List<LogStream> describeLogStreams(List<LogStream> logStreams, String nextToken)
296
+ {
297
+ try {
298
+ String logGroupName = task.getLogGroupName();
299
+ DescribeLogStreamsRequest request = new DescribeLogStreamsRequest();
300
+ request.setLogGroupName(logGroupName);
301
+ if (nextToken != null) {
302
+ request.setNextToken(nextToken);
303
+ }
304
+ if (task.getLogStreamName().isPresent()) {
305
+ request.setLogStreamNamePrefix(task.getLogStreamName().get());
306
+ }
307
+
308
+ DescribeLogStreamsResult response = client.describeLogStreams(request);
309
+ if (!logStreams.isEmpty()) {
310
+ for (LogStream stream : response.getLogStreams()) {
311
+ logStreams.add(stream);
312
+ }
313
+ }
314
+ else {
315
+ logStreams = response.getLogStreams();
316
+ }
317
+ if (response.getNextToken() != null) {
318
+ logStreams = describeLogStreams(logStreams, response.getNextToken());
319
+ }
320
+
321
+ return logStreams;
322
+ }
323
+ catch (AmazonServiceException ex) {
324
+ if (ex.getErrorType().equals(AmazonServiceException.ErrorType.Client)) {
325
+ // HTTP 40x errors. auth error etc. See AWS document for the full list:
326
+ // https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/CommonErrors.html
327
+ if (ex.getStatusCode() != 400 // 404 Bad Request is unexpected error
328
+ || "ExpiredToken".equalsIgnoreCase(ex.getErrorCode())) { // if statusCode == 400 && errorCode == ExpiredToken => throws ConfigException
329
+ throw new ConfigException(ex);
330
+ }
331
+ }
332
+ throw ex;
333
+ }
334
+ }
335
+ }
336
+ }