From dadc3358eaf1218a26fcac1a7924c20b7a1a655a Mon Sep 17 00:00:00 2001 From: Junlong Date: Mon, 21 Mar 2022 12:24:27 +0800 Subject: [PATCH 1/9] docs:add Contributing and LICENSE --- CONTRIBUTING.md | 37 +++++++++ LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++ doc/zh.md | 3 + readme.md | 7 +- 4 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..ca44dc1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# Holmes contributor guide + +Holmes is released under the Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into master. If you would like to contribute something, or simply want to hack on the code this document should help you get started. + +Before we accept a non-trivial patch or pull request we will need you to sign the Contributor License Agreement. Signing the contributor’s agreement does not grant anyone commits rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. Active contributors might be asked to join the core team and given the ability to merge pull requests. + +## Code Conventions + +None of these is essential for a pull request, but they will all help. + +1. Code format +- With cli, run `goimports -w yourfile.go` and `golint yourfile.go` to format the style +- With ide like goland, select 'Group stdlib imports', 'Move all stdlib imports in a single group', 'Move all imports in a single declaration' in Go->imports page +- We would check code format when run ci test, so please ensure that you have built project before you push branch. +2. Make sure all new `.go` files to have a simple doc class comment + with at least an `author` tag identifying you, and preferably at least a + paragraph on what the class is for. +3. Add the ASF license header comment to all new `.go` files (copy from existing files in the project) +4. Add yourself as an `author` to the `.go` files that you modify substantially (more than cosmetic changes). +5. Add some docs. +6. A few unit tests would help a lot as well — someone has to do it. +7. When writing a commit message please follow [these conventions](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html), if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit message (where XXXX is the issue number). +8. Please ensure that code coverage will not decrease. +9. Contribute a PR as the rule of Gitflow Workflow, and you should follow the pull request's rules. + +## Version naming convention + +Holmes's version contains three-digit with the format x.x.x, the first one is for compatibility; the second one is for new features and enhancement; the last one is for a bug fix. + +## PR review policy for maintainers + +The following strategies are recommended for project maintainers to review code: + +1. Check the issue with this PR +2. Check the solution's reasonability +3. Check UT's and Benchmark's result +4. Pay attention to the code which makes the code structure change, the usage of the global variable, the handling of the corner case and concurrency diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. \ No newline at end of file diff --git a/doc/zh.md b/doc/zh.md index f3f673f..ede150f 100644 --- a/doc/zh.md +++ b/doc/zh.md @@ -251,3 +251,6 @@ Gorountine dump 会导致 STW,[从而导致时延](https://github.com/golang/g ## 使用示例 [点击这里](./example.md) + +## Contributing +See our [contributor guide](./CONTRIBUTING.md). \ No newline at end of file diff --git a/readme.md b/readme.md index 121487f..72b84d1 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,5 @@ +![license](https://img.shields.io/badge/license-Apache--2.0-green.svg) + * [Holmes](#holmes) * [Design](#design) * [How to use](#how-to-use) @@ -223,4 +225,7 @@ h, _ := holmes.New( Collect a goroutine itself [may cause latency spike](https://github.com/golang/go/issues/33250) because of the STW. ## Show cases -[Click here](./doc/example.md) \ No newline at end of file +[Click here](./doc/example.md) + +## Contributing +See our [contributor guide](./CONTRIBUTING.md). \ No newline at end of file From 746dfcc65376b9f5cf03903060f83d38052e6768 Mon Sep 17 00:00:00 2001 From: Junlong Date: Mon, 21 Mar 2022 14:21:40 +0800 Subject: [PATCH 2/9] docs:add Contributing and LICENSE --- dingtalk.png | Bin 0 -> 86976 bytes readme.md | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 dingtalk.png diff --git a/dingtalk.png b/dingtalk.png new file mode 100644 index 0000000000000000000000000000000000000000..dbce0ccf6b313bc53c6852e82df31d4a2a08090f GIT binary patch literal 86976 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

2*q3gl@;$bG(d1MSWGS%z6$o|n?^Co5<% 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 z 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 72b84d1..b81f023 100644 --- a/readme.md +++ b/readme.md @@ -228,4 +228,12 @@ Collect a goroutine itself [may cause latency spike](https://github.com/golang/g [Click here](./doc/example.md) ## Contributing -See our [contributor guide](./CONTRIBUTING.md). \ No newline at end of file +See our [contributor guide](./CONTRIBUTING.md). + +## Community + +Scan the QR code below with DingTalk(钉钉) to join the Holmes user group. + +dingtalk + + From 108a1559b8f3815d6bd593558dfa3aac90f89ed1 Mon Sep 17 00:00:00 2001 From: Junlong Date: Mon, 21 Mar 2022 15:10:01 +0800 Subject: [PATCH 3/9] feat:add license to go file --- consts.go | 17 +++++++++++++++++ doc/example.md | 19 ++++++++++++++++++- example/1gbslice/1gbslice.go | 17 +++++++++++++++++ example/alloc/alloc.go | 17 +++++++++++++++++ example/channelblock/channelblock.go | 17 +++++++++++++++++ example/cpu_explode/cpu_explode.go | 17 +++++++++++++++++ example/deadlock/deadlock.go | 17 +++++++++++++++++ example/deadloop/deadloop.go | 17 +++++++++++++++++ example/gcheap/gcheap.go | 17 +++++++++++++++++ example/run_in_docker/run_in_docker.go | 17 +++++++++++++++++ example/slowlyleak/slowlyleak.go | 17 +++++++++++++++++ example/thread_trigger/thread_trigger.go | 17 +++++++++++++++++ holmes.go | 17 +++++++++++++++++ holmes_test.go | 17 +++++++++++++++++ log.go | 17 +++++++++++++++++ options.go | 17 +++++++++++++++++ reporters/http_reporter/http_reporter.go | 17 +++++++++++++++++ reporters/http_reporter/http_reporter_test.go | 17 +++++++++++++++++ reporters/reporter_test.go | 17 +++++++++++++++++ ring.go | 17 +++++++++++++++++ ring_test.go | 17 +++++++++++++++++ util.go | 17 +++++++++++++++++ 22 files changed, 375 insertions(+), 1 deletion(-) diff --git a/consts.go b/consts.go index cb3e6ad..8648bf6 100644 --- a/consts.go +++ b/consts.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( diff --git a/doc/example.md b/doc/example.md index d915624..a9345d9 100644 --- a/doc/example.md +++ b/doc/example.md @@ -150,7 +150,24 @@ Dropped 6 nodes (cum <= 0.10s) Total: 19.46s ROUTINE ======================== main.cpuex.func1 in /Users/xargin/go/src/github.com/mosn/holmes/example/cpu_explode.go 17.81s 19.45s (flat, cum) 99.95% of Total - 80ms 80ms 1:package main + 80ms 80ms 1:/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package main . . 2: . . 3:import ( . . 4: "net/http" diff --git a/example/1gbslice/1gbslice.go b/example/1gbslice/1gbslice.go index 20541c8..0b8ec01 100644 --- a/example/1gbslice/1gbslice.go +++ b/example/1gbslice/1gbslice.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/alloc/alloc.go b/example/alloc/alloc.go index e53af12..7afa07a 100644 --- a/example/alloc/alloc.go +++ b/example/alloc/alloc.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/channelblock/channelblock.go b/example/channelblock/channelblock.go index dc3790b..1177d5c 100644 --- a/example/channelblock/channelblock.go +++ b/example/channelblock/channelblock.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/cpu_explode/cpu_explode.go b/example/cpu_explode/cpu_explode.go index 8e7b252..89ff961 100644 --- a/example/cpu_explode/cpu_explode.go +++ b/example/cpu_explode/cpu_explode.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/deadlock/deadlock.go b/example/deadlock/deadlock.go index eaa9a71..48bbd0b 100644 --- a/example/deadlock/deadlock.go +++ b/example/deadlock/deadlock.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/deadloop/deadloop.go b/example/deadloop/deadloop.go index 8d26845..54edd0a 100644 --- a/example/deadloop/deadloop.go +++ b/example/deadloop/deadloop.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/gcheap/gcheap.go b/example/gcheap/gcheap.go index 73e1d5e..4ad5cdd 100644 --- a/example/gcheap/gcheap.go +++ b/example/gcheap/gcheap.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/run_in_docker/run_in_docker.go b/example/run_in_docker/run_in_docker.go index 8513a14..213e1c2 100644 --- a/example/run_in_docker/run_in_docker.go +++ b/example/run_in_docker/run_in_docker.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/slowlyleak/slowlyleak.go b/example/slowlyleak/slowlyleak.go index e55ad1b..90341d5 100644 --- a/example/slowlyleak/slowlyleak.go +++ b/example/slowlyleak/slowlyleak.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main import ( diff --git a/example/thread_trigger/thread_trigger.go b/example/thread_trigger/thread_trigger.go index 82d5bea..9e8d36a 100644 --- a/example/thread_trigger/thread_trigger.go +++ b/example/thread_trigger/thread_trigger.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package main /* diff --git a/holmes.go b/holmes.go index 65c9937..c16b02b 100644 --- a/holmes.go +++ b/holmes.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( diff --git a/holmes_test.go b/holmes_test.go index fed51dd..8f410cf 100644 --- a/holmes_test.go +++ b/holmes_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( diff --git a/log.go b/log.go index 7ebc098..43f9989 100644 --- a/log.go +++ b/log.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( diff --git a/options.go b/options.go index 007f4e6..fecda69 100644 --- a/options.go +++ b/options.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( diff --git a/reporters/http_reporter/http_reporter.go b/reporters/http_reporter/http_reporter.go index 8484ee8..f03a23f 100644 --- a/reporters/http_reporter/http_reporter.go +++ b/reporters/http_reporter/http_reporter.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http_reporter import ( diff --git a/reporters/http_reporter/http_reporter_test.go b/reporters/http_reporter/http_reporter_test.go index a744d64..df45d8d 100644 --- a/reporters/http_reporter/http_reporter_test.go +++ b/reporters/http_reporter/http_reporter_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package http_reporter import ( diff --git a/reporters/reporter_test.go b/reporters/reporter_test.go index eac4d25..89c6ee1 100644 --- a/reporters/reporter_test.go +++ b/reporters/reporter_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package reporters import ( diff --git a/ring.go b/ring.go index 2b12fb0..3af10ae 100644 --- a/ring.go +++ b/ring.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes type ring struct { diff --git a/ring_test.go b/ring_test.go index 51aceef..b315dbc 100644 --- a/ring_test.go +++ b/ring_test.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( diff --git a/util.go b/util.go index 7643ca3..fcd5162 100644 --- a/util.go +++ b/util.go @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package holmes import ( From 4b6e94a306d134ea83da9a59b10bd7ee31106a8a Mon Sep 17 00:00:00 2001 From: Junlong Date: Tue, 29 Mar 2022 21:53:31 +0800 Subject: [PATCH 4/9] docs:fix typos(#88) --- doc/zh.md | 2 +- readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/zh.md b/doc/zh.md index ede150f..1f362da 100644 --- a/doc/zh.md +++ b/doc/zh.md @@ -193,7 +193,7 @@ h.Stop() ```go type ReporterImpl struct{} - func (r *ReporterImple) Report(pType string, buf []byte, reason string, eventID string) error{ + func (r *ReporterImpl) Report(pType string, buf []byte, reason string, eventID string) error{ // do something } ...... diff --git a/readme.md b/readme.md index b81f023..0dedde7 100644 --- a/readme.md +++ b/readme.md @@ -168,7 +168,7 @@ You can use `Reporter` to implement the following features: ```go type ReporterImpl struct{} - func (r *ReporterImple) Report(pType string, buf []byte, reason string, eventID string) error{ + func (r *ReporterImpl) Report(pType string, buf []byte, reason string, eventID string) error{ // do something } ...... From e76d4cea1edfb6f98e02fbbdc2a8b9f23f99a3dc Mon Sep 17 00:00:00 2001 From: Junlong Date: Tue, 29 Mar 2022 22:19:38 +0800 Subject: [PATCH 5/9] feat:supports groutine dump on logger(#90) --- holmes.go | 5 +++++ options.go | 12 +++++++++++- reporters/reporter_test.go | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/holmes.go b/holmes.go index c16b02b..1988ca4 100644 --- a/holmes.go +++ b/holmes.go @@ -722,6 +722,11 @@ func (h *Holmes) writeProfileDataToFile(data bytes.Buffer, dumpType configureTyp h.Errorf("failed to write profile to file(%v), err: %s", fileName, err.Error()) return } + + if h.opts.DumpOptions.DumpGrToLogger { + h.Infof("goroutine dump on logger: \n" + data.String()) + } + h.Infof("[Holmes] pprof %v profile write to file %v successfully", check2name[dumpType], fileName) } diff --git a/options.go b/options.go index fecda69..264febb 100644 --- a/options.go +++ b/options.go @@ -18,10 +18,11 @@ package holmes import ( - mlog "mosn.io/pkg/log" "sync" "sync/atomic" "time" + + mlog "mosn.io/pkg/log" ) type options struct { @@ -94,6 +95,8 @@ type DumpOptions struct { DumpProfileType dumpProfileType // only dump top 10 if set to false, otherwise dump all, only effective when in_text = true DumpFullStack bool + // dump goroutine to logger. issues/90 + DumpGrToLogger bool } // ShrinkThrOptions contains the configuration about shrink thread @@ -287,6 +290,13 @@ func WithGoroutineDump(min int, diff int, abs int, max int, coolDown time.Durati }) } +func WithGrDumpToLogger(new bool) Option { + return optionFunc(func(opts *options) (err error) { + opts.DumpGrToLogger = new + return + }) +} + type typeOption struct { Enable bool // mem/cpu/gcheap trigger minimum in percent, goroutine/thread trigger minimum in number diff --git a/reporters/reporter_test.go b/reporters/reporter_test.go index 89c6ee1..340315b 100644 --- a/reporters/reporter_test.go +++ b/reporters/reporter_test.go @@ -123,6 +123,7 @@ func TestReporterReopen(t *testing.T) { holmes.WithGoroutineDump(5, 10, 20, 90, time.Second), holmes.WithCPUDump(0, 2, 80, time.Second), holmes.WithCollectInterval("5s"), + holmes.WithGrDumpToLogger(true), ) if err != nil { log.Fatalf("fail to set opts on running time.") From 2cfcad44d1ac6c70bfde66b2ea58f725e939a136 Mon Sep 17 00:00:00 2001 From: Junlong Date: Wed, 30 Mar 2022 09:43:11 +0800 Subject: [PATCH 6/9] feat:supports groutine dump on logger(#90) --- holmes.go | 4 ++-- options.go | 8 ++++---- reporters/reporter_test.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/holmes.go b/holmes.go index 1988ca4..d966151 100644 --- a/holmes.go +++ b/holmes.go @@ -723,8 +723,8 @@ func (h *Holmes) writeProfileDataToFile(data bytes.Buffer, dumpType configureTyp return } - if h.opts.DumpOptions.DumpGrToLogger { - h.Infof("goroutine dump on logger: \n" + data.String()) + if h.opts.DumpOptions.DumpToLogger { + h.Infof("dump profile on logger: \n" + data.String()) } h.Infof("[Holmes] pprof %v profile write to file %v successfully", check2name[dumpType], fileName) diff --git a/options.go b/options.go index 264febb..4cda8c2 100644 --- a/options.go +++ b/options.go @@ -95,8 +95,8 @@ type DumpOptions struct { DumpProfileType dumpProfileType // only dump top 10 if set to false, otherwise dump all, only effective when in_text = true DumpFullStack bool - // dump goroutine to logger. issues/90 - DumpGrToLogger bool + // dump profile to logger. It will make huge log output if enable DumpToLogger option. issues/90 + DumpToLogger bool } // ShrinkThrOptions contains the configuration about shrink thread @@ -290,9 +290,9 @@ func WithGoroutineDump(min int, diff int, abs int, max int, coolDown time.Durati }) } -func WithGrDumpToLogger(new bool) Option { +func WithDumpToLogger(new bool) Option { return optionFunc(func(opts *options) (err error) { - opts.DumpGrToLogger = new + opts.DumpToLogger = new return }) } diff --git a/reporters/reporter_test.go b/reporters/reporter_test.go index 340315b..978635d 100644 --- a/reporters/reporter_test.go +++ b/reporters/reporter_test.go @@ -123,7 +123,7 @@ func TestReporterReopen(t *testing.T) { holmes.WithGoroutineDump(5, 10, 20, 90, time.Second), holmes.WithCPUDump(0, 2, 80, time.Second), holmes.WithCollectInterval("5s"), - holmes.WithGrDumpToLogger(true), + holmes.WithDumpToLogger(true), ) if err != nil { log.Fatalf("fail to set opts on running time.") From 07f1ba237f804d46d79c09aeab3f1646439dd818 Mon Sep 17 00:00:00 2001 From: Junlong Date: Wed, 30 Mar 2022 19:18:35 +0800 Subject: [PATCH 7/9] feat:supports cpu dump on logger(#90) --- holmes.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/holmes.go b/holmes.go index d966151..ed9844e 100644 --- a/holmes.go +++ b/holmes.go @@ -589,6 +589,15 @@ func (h *Holmes) cpuProfile(curCPUUsage int, c typeOption) bool { time.Sleep(defaultCPUSamplingTime) pprof.StopCPUProfile() + if h.opts.DumpToLogger { + bfCpy, err := ioutil.ReadFile(binFileName) + if err != nil { + h.Errorf("encounter error when dumping profile to logger, failed to read cpu profile file: %v", err) + return true + } + h.Infof("dump profile on logger: \n" + string(bfCpy)) + } + if opts := h.opts.GetReporterOpts(); opts.active == 1 { bfCpy, err := ioutil.ReadFile(binFileName) if err != nil { From 83858d8b663fd6aa7a0e174d29460c7d24db0858 Mon Sep 17 00:00:00 2001 From: Junlong Date: Thu, 31 Mar 2022 09:32:07 +0800 Subject: [PATCH 8/9] refine:refine log(#90) --- holmes.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/holmes.go b/holmes.go index ed9844e..d7441fb 100644 --- a/holmes.go +++ b/holmes.go @@ -595,7 +595,7 @@ func (h *Holmes) cpuProfile(curCPUUsage int, c typeOption) bool { h.Errorf("encounter error when dumping profile to logger, failed to read cpu profile file: %v", err) return true } - h.Infof("dump profile on logger: \n" + string(bfCpy)) + h.Infof("[Holmes] CPU profile:: \n" + string(bfCpy)) } if opts := h.opts.GetReporterOpts(); opts.active == 1 { @@ -733,7 +733,7 @@ func (h *Holmes) writeProfileDataToFile(data bytes.Buffer, dumpType configureTyp } if h.opts.DumpOptions.DumpToLogger { - h.Infof("dump profile on logger: \n" + data.String()) + h.Infof(fmt.Sprintf("[Holmes] %v profile: \n", check2name[dumpType]) + data.String()) } h.Infof("[Holmes] pprof %v profile write to file %v successfully", check2name[dumpType], fileName) From 1da679302a4afc7bbf28406eea40953bb40387c6 Mon Sep 17 00:00:00 2001 From: Junlong Date: Thu, 31 Mar 2022 10:14:45 +0800 Subject: [PATCH 9/9] refine:add docs(#90) --- doc/zh.md | 4 +++- readme.md | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/zh.md b/doc/zh.md index 1f362da..6a00a36 100644 --- a/doc/zh.md +++ b/doc/zh.md @@ -81,6 +81,7 @@ h, _ := holmes.New( holmes.WithCollectInterval("5s"), holmes.WithDumpPath("/tmp"), holmes.WithTextDump(), + holmes.WithDumpToLogger(true), holmes.WithGoroutineDump(10, 25, 2000, 10*1000, time.Minute), ) h.EnableGoroutineDump() @@ -94,7 +95,8 @@ h.Stop() * WithCollectInterval("5s") 每5s采集一次当前应用的各项指标,该值建议设置为大于1s。 * WithDumpPath("/tmp") profile文件保存路径。 -* WithTextDump() profile的内容将会输出到日志中。 +* WithTextDump() 以文本格式保存profile内容。 +* WithDumpToLogger() profile内容将会输出到日志。 * WithGoroutineDump(10, 25, 2000, 100*1000, time.Minute) 当goroutine指标满足以下条件时,将会触发dump操作。 current_goroutine_num > `10` && current_goroutine_num < `100*1000` && current_goroutine_num > `125`% * previous_average_goroutine_num or current_goroutine_num > `2000`. diff --git a/readme.md b/readme.md index 0dedde7..2366149 100644 --- a/readme.md +++ b/readme.md @@ -53,6 +53,7 @@ h, _ := holmes.New( holmes.WithCollectInterval("5s"), holmes.WithDumpPath("/tmp"), holmes.WithTextDump(), + holmes.WithDumpToLogger(true), holmes.WithGoroutineDump(10, 25, 2000, 10*1000,time.Minute), ) h.EnableGoroutineDump() @@ -67,6 +68,7 @@ h.Stop() * WithCollectInterval("5s") means the system metrics are collected once 5 seconds * WithDumpPath("/tmp") means the dump binary file(binary mode) will write content to `/tmp` dir. * WithTextDump() means not in binary mode, so it's text mode profiles +* WithDumpToLogger() means profiles information will be outputted to logger. * WithGoroutineDump(10, 25, 2000, 100*1000,time.Minute) means dump will happen when current_goroutine_num > 10 && current_goroutine_num < `100*1000` && current_goroutine_num > `125%` * previous_average_goroutine_num or current_goroutine_num > `2000`, `time.Minute` means once a dump happened, the next dump will not happen before cooldown