Skip to content
This repository was archived by the owner on Feb 12, 2022. It is now read-only.

Commit 0bd6efd

Browse files
authored
Add option for FileManagerStrategy delete stale data (#64)
* Add option for FileManagerStrategy discard stale data Signed-off-by: Jesse Ikawa <[email protected]> * Add unit tests Signed-off-by: Jesse Ikawa <[email protected]>
1 parent e38fc05 commit 0bd6efd

File tree

5 files changed

+131
-0
lines changed

5 files changed

+131
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ An example configuration file called `sample_configuration.yaml` is provided. Wh
124124
| publish_topic_names | Whether or not to include topic name information in the log messsages that are uploaded to AWS CloudWatch Logs | *bool* | true/false | true |
125125
| storage_directory | The location where all offline metrics will be stored | *string* | string | ~/.ros/cwlogs/ |
126126
| storage_limit | The maximum size of all offline storage files in KB. Once this limit is reached offline logs will start to be deleted oldest first. | *int* | number | 1048576 |
127+
| delete_stale_data | Whether or not to delete log batch data that are over 14 days old, which are rejected by [AWS PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html). | *bool* | true/false | false |
127128
| aws_client_configuration | AWS region configuration | *std::string* | *region*: "us-west-2"/"us-east-1"/"us-east-2"/etc. | region: us-west-2 |
128129

129130
### Advanced Configuration Parameters

cloudwatch_logger/config/sample_configuration.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ storage_directory: "~/.ros/cwlogs/"
4444
# The maximum size of all files in offline storage in KB
4545
storage_limit: 1048576
4646

47+
# whether or not to automatically delete log data > 14 days old
48+
#default value is: false
49+
delete_stale_data: false
50+
4751
# This is the AWS Client Configuration used by the AWS service client in the Node. If given the node will load the
4852
# provided configuration when initializing the client.
4953
aws_client_configuration:

cloudwatch_logger/include/cloudwatch_logger/log_node_param_helper.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ constexpr char kNodeParamStorageDirectory[] = "storage_directory";
5151
constexpr char kNodeParamFileExtension[] = "file_extension";
5252
constexpr char kNodeParamMaximumFileSize[] = "maximum_file_size";
5353
constexpr char kNodeParamStorageLimit[] = "storage_limit";
54+
constexpr char kNodeParamDeleteStaleData[] = "delete_stale_data";
5455

5556
/** Default values for parameters **/
5657
constexpr char kNodeLogGroupNameDefaultValue[] = "ros_log_group";
@@ -231,6 +232,22 @@ void ReadOption(
231232
const size_t & default_value,
232233
size_t & option_value);
233234

235+
/**
236+
* Fetch a single size_t option
237+
*
238+
* @param parameter_reader to retrieve the parameters from
239+
* @param option_key the parameter key to read
240+
* @param default_value a default value if the parameter doesn't exist or is unreadble
241+
* @param option_value the size_t value for this option
242+
* @return an error code that indicates whether the parameter was read successfully or not,
243+
* as returned by \p parameter_reader
244+
*/
245+
void ReadOption(
246+
const std::shared_ptr<Aws::Client::ParameterReaderInterface>& parameter_reader,
247+
const std::string & option_key,
248+
const bool & default_value,
249+
bool & option_value);
250+
234251
} // namespace Utils
235252
} // namespace CloudWatchLogs
236253
} // namespace Aws

cloudwatch_logger/src/log_node_param_helper.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,12 @@ void ReadFileManagerStrategyOptions(
335335
kNodeParamStorageLimit,
336336
Aws::FileManagement::kDefaultFileManagerStrategyOptions.storage_limit_in_kb,
337337
file_manager_strategy_options.storage_limit_in_kb);
338+
339+
ReadOption(
340+
parameter_reader,
341+
kNodeParamDeleteStaleData,
342+
Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data,
343+
file_manager_strategy_options.delete_stale_data);
338344
}
339345

340346
void ReadOption(
@@ -383,6 +389,29 @@ void ReadOption(
383389
}
384390
}
385391

392+
void ReadOption(
393+
const std::shared_ptr<Aws::Client::ParameterReaderInterface>& parameter_reader,
394+
const std::string & option_key,
395+
const bool & default_value,
396+
bool & option_value)
397+
{
398+
Aws::AwsError ret = parameter_reader->ReadParam(ParameterPath(option_key), option_value);
399+
switch (ret) {
400+
case Aws::AwsError::AWS_ERR_NOT_FOUND:
401+
option_value = default_value;
402+
AWS_LOGSTREAM_INFO(__func__,
403+
option_key << " parameter not found, setting to default value: " << default_value);
404+
break;
405+
case Aws::AwsError::AWS_ERR_OK:
406+
AWS_LOGSTREAM_INFO(__func__, option_key << " is set to: " << option_value);
407+
break;
408+
default:
409+
option_value = default_value;
410+
AWS_LOGSTREAM_ERROR(__func__,
411+
"Error " << ret << " retrieving option " << option_key << ", setting to default value: " << default_value);
412+
}
413+
}
414+
386415
} // namespace Utils
387416
} // namespace CloudWatchLogs
388417
} // namespace Aws

cloudwatch_logger/test/log_node_param_helper_test.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,86 @@ TEST_F(LogNodeParamHelperFixture, TestReadIgnoreNodesSet)
319319
EXPECT_EQ(AwsError::AWS_ERR_OK, ReadIgnoreNodesSet(param_reader_, param));
320320
EXPECT_EQ(1, param.count("String1"));
321321
}
322+
/**
323+
* FileManagerStrategyOptions options defined with delete_stale_data set to true.
324+
* First ReadParam call fails, therefore we expect options_.delete_stale_data set true->false.
325+
* Second ReadParam call suceeds, therefore we expect options_.delete_stale_data set false->true.
326+
* Third ReadParam call not found, therefore we expect options_.delete_stale_data set true->false.
327+
*/
328+
TEST_F(LogNodeParamHelperFixture, Test_Delete_Stale_Data_True)
329+
{
330+
{
331+
InSequence read_param_seq;
332+
333+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
334+
.WillOnce(Return(AwsError::AWS_ERR_FAILURE));
335+
336+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
337+
.WillOnce(
338+
DoAll(SetArgReferee<1>(true), Return(AwsError::AWS_ERR_OK))
339+
);
340+
341+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
342+
.WillOnce(Return(AwsError::AWS_ERR_NOT_FOUND));
343+
}
344+
345+
Aws::FileManagement::FileManagerStrategyOptions options_{"test", "log_tests/", ".log", 1024*1024, 1024*1024, true};
346+
ASSERT_TRUE(options_.delete_stale_data);
347+
348+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
349+
ASSERT_FALSE(options_.delete_stale_data);
350+
351+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
352+
ASSERT_TRUE(options_.delete_stale_data);
353+
354+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
355+
ASSERT_FALSE(options_.delete_stale_data);
356+
}
357+
/**
358+
* FileManagerStrategyOptions options defined with delete_stale_data not defined.
359+
* We expect that when delete_stale_data is not defined that it will default to false.
360+
* First ReadParam call suceeds, therefore we expect options_.delete_stale_data set false->true.
361+
* Second ReadParam call fails, therefore we expect options_.delete_stale_data set true->false.
362+
* Third ReadParam call suceeds, therefore we expect options_.delete_stale_data set false->true.
363+
* Forth ReadParam call not found, therefore we expect options_.delete_stale_data set true->false.
364+
*/
365+
TEST_F(LogNodeParamHelperFixture, Test_Delete_Stale_Data_Not_Defined)
366+
{
367+
{
368+
InSequence read_param_seq;
369+
370+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
371+
.WillOnce(
372+
DoAll(SetArgReferee<1>(true), Return(AwsError::AWS_ERR_OK))
373+
);
374+
375+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
376+
.WillOnce(Return(AwsError::AWS_ERR_FAILURE));
377+
378+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
379+
.WillOnce(
380+
DoAll(SetArgReferee<1>(true), Return(AwsError::AWS_ERR_OK))
381+
);
382+
383+
EXPECT_CALL(*param_reader_, ReadParam(Eq(ParameterPath(kNodeParamDeleteStaleData)), A<bool &>()))
384+
.WillOnce(Return(AwsError::AWS_ERR_NOT_FOUND));
385+
}
386+
387+
Aws::FileManagement::FileManagerStrategyOptions options_{"test", "log_tests/", ".log", 1024*1024, 1024*1024};
388+
ASSERT_FALSE(options_.delete_stale_data);
389+
390+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
391+
ASSERT_TRUE(options_.delete_stale_data);
392+
393+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
394+
ASSERT_FALSE(options_.delete_stale_data);
395+
396+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
397+
ASSERT_TRUE(options_.delete_stale_data);
398+
399+
ReadOption(param_reader_, kNodeParamDeleteStaleData, Aws::FileManagement::kDefaultFileManagerStrategyOptions.delete_stale_data, options_.delete_stale_data);
400+
ASSERT_FALSE(options_.delete_stale_data);
401+
}
322402

323403
int main(int argc, char ** argv)
324404
{

0 commit comments

Comments
 (0)