From 786065ddc9b06f9f3b67769cfd294a17b1f92ff9 Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Thu, 21 Apr 2016 12:52:31 -0700 Subject: [PATCH] Add Error Reporting Code --- error_reporting/README.md | 27 ++++++++++++++++++++ error_reporting/main.py | 41 +++++++++++++++++++++++++++++++ error_reporting/requirements.txt | 1 + error_reporting/startup_script.sh | 35 ++++++++++++++++++++++++++ error_reporting/test_main.py | 22 +++++++++++++++++ 5 files changed, 126 insertions(+) create mode 100644 error_reporting/README.md create mode 100644 error_reporting/main.py create mode 100644 error_reporting/requirements.txt create mode 100644 error_reporting/startup_script.sh create mode 100644 error_reporting/test_main.py diff --git a/error_reporting/README.md b/error_reporting/README.md new file mode 100644 index 000000000000..e88c1445549e --- /dev/null +++ b/error_reporting/README.md @@ -0,0 +1,27 @@ +# Google Error Reorting Samples Samples + +This section contains samples for [Google Cloud Error Reporting](https://cloud.google.com/error-reporting). + +A startup script has been provided to demonstrated how to properly provision a GCE +instance with fluentd configured. Note the intallation of fluentd, the addition of the config file, + and the restarting of the fluetnd service. You can start an instance using +it like this: + + gcloud compute instances create example-instance --metadata-from-file startup-script=startup_script.sh + +or simply use it as reference when creating your own instance. + +After fluentd is configured, main.py could be used to simulate an error: + + gcloud compute copy-files main.py example-instance:~/main.py + +Then, + + gcloud compute ssh example-instance + python ~/main.py + +And you will see the message in the Errors Console. + + + + diff --git a/error_reporting/main.py b/error_reporting/main.py new file mode 100644 index 000000000000..8ed8d5e99418 --- /dev/null +++ b/error_reporting/main.py @@ -0,0 +1,41 @@ +# Copyright 2016 Google Inc. All rights reserved. +# +# 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 +# +# 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. + +# [START error_reporting] +import traceback + +import fluent.event +import fluent.sender + + +def simulate_error(): + fluent.sender.setup('myapp', host='localhost', port=24224) + + def report(ex): + data = {} + data['message'] = '{0}'.format(ex) + data['serviceContext'] = {'service': 'myapp'} + # ... add more metadata + fluent.event.Event('errors', data) + + # report exception data using: + try: + # simulate calling a method that's not defined + raise NameError + except Exception: + report(traceback.format_exc()) +# [END error_reporting] + +if __name__ == '__main__': + simulate_error() diff --git a/error_reporting/requirements.txt b/error_reporting/requirements.txt new file mode 100644 index 000000000000..04d09eef0098 --- /dev/null +++ b/error_reporting/requirements.txt @@ -0,0 +1 @@ +fluent-logger==0.4.1 diff --git a/error_reporting/startup_script.sh b/error_reporting/startup_script.sh new file mode 100644 index 000000000000..f2ef895dcfdc --- /dev/null +++ b/error_reporting/startup_script.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# Copyright 2016 Google Inc. All rights reserved. +# +# 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 +# +# 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. + +set -v + +curl -sSO "https://dl.google.com/cloudagents/install-logging-agent.sh" +chmod +x install-logging-agent.sh +./install-logging-agent.sh +mkdir -p /etc/google-fluentd/config.d/ +cat < /etc/google-fluentd/config.d/forward.conf + + type forward + port 24224 + +EOF +service google-fluentd restart + +apt-get update +apt-get install -yq \ + git build-essential supervisor python python-dev python-pip libffi-dev \ + libssl-dev +pip install fluent-logger + diff --git a/error_reporting/test_main.py b/error_reporting/test_main.py new file mode 100644 index 000000000000..15064742a7aa --- /dev/null +++ b/error_reporting/test_main.py @@ -0,0 +1,22 @@ +# Copyright 2016 Google Inc. All rights reserved. +# +# 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 +# +# 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. + +import main +import mock + + +@mock.patch("fluent.event") +def test_error_sends(event_mock): + main.simulate_error() + event_mock.Event.assert_called_once_with(mock.ANY, mock.ANY)