Version information
This version is compatible with:
- Puppet Enterprise >= 3.0.0 < 2016.5.0
- Puppet >= 3.0.0 < 5.0.0
- , , , , , ,
Start using this module
Add this module to your Puppetfile:
mod 'pcfens-filebeat', '0.10.1'
Learn more about managing modules with a PuppetfileDocumentation
puppet-filebeat
Table of Contents
- Description
- Setup - The basics of getting started with filebeat
- Usage - Configuration options and additional functionality
- Reference
- Limitations - OS compatibility, etc.
- Development - Guide for contributing to the module
Description
The filebeat
module installs and configures the filebeat log shipper maintained by elastic.
Setup
What filebeat affects
By default filebeat
adds a software repository to your system, and installs filebeat along
with required configurations.
Upgrading to Filebeat 5.x
If you use this module on a system with filebeat 1.x installed, and you keep your current parameters
nothing will change. Setting major_version
to '5' will modify the configuration template and update
package repositories, but won't update the package itself. To update the package set the
package_ensure
parameter to at least 5.0.0.
Windows users should set major_version
to 5 and update the download_url
parameter to the correct
download.
If you're on a Debian based system, you need to make sure that the apt-transport-https package is installed if you want this module to manage the repository for you (it does by default).
Setup Requirements
The filebeat
module depends on puppetlabs/stdlib
, and on
puppetlabs/apt
on Debian based systems.
Beginning with filebeat
filebeat
can be installed with puppet module install pcfens-filebeat
(or with r10k, librarian-puppet, etc.)
The only required parameter, other than which files to ship, is the outputs
parameter.
Usage
All of the default values in filebeat follow the upstream defaults (at the time of writing).
To ship files to elasticsearch:
class { 'filebeat':
outputs => {
'elasticsearch' => {
'hosts' => [
'http://localhost:9200',
'http://anotherserver:9200'
],
'index' => 'packetbeat',
'cas' => [
'/etc/pki/root/ca.pem',
],
},
},
}
To ship log files through logstash:
class { 'filebeat':
outputs => {
'logstash' => {
'hosts' => [
'localhost:5044',
'anotherserver:5044'
],
'loadbalance' => true,
},
},
}
Shipper and logging options can be configured the same way, and are documented on the elastic website.
Adding a prospector
Prospectors are processes that ship log files to elasticsearch or logstash. They can be defined as a hash added to the class declaration (also used for automatically creating prospectors using hiera), or as their own defined resources.
At a minimum, the paths
parameter must be set to an array of files or blobs that should
be shipped. doc_type
is what logstash views as the type parameter if you'd like to
apply conditional filters.
filebeat::prospector { 'syslogs':
paths => [
'/var/log/auth.log',
'/var/log/syslog',
],
doc_type => 'syslog-beat',
}
Multiline Logs
Filebeat prospectors (versions >= 1.1) can handle multiline log entries. The multiline
parameter accepts a hash containing pattern
, negate
, match
, max_lines
, and timeout
as documented in the filebeat configuration documentation.
JSON Logs
Filebeat prospectors (versions >= 5.0) can natively decode JSON objects if they are stored one per line. The json
parameter accepts a hash containing message_key
, keys_under_root
, overwrite_keys
, and add_error_key
as documented in the filebeat configuration documentation.
Prospectors in Hiera
Prospectors can be declared in hiera using the prospectors
parameter. By default, hiera will not merge
prospector declarations down the hiera hierarchy. To change the behavior in puppet 3 use the prospectors_merge
parameter. In puppet 4, you can use prospectors_merge
, but can also use the
lookup_options
flag.
When prospectors_merge
is set to true, prospectors
will be replaced by the output of
hiera_hash('filebeat::prospectors')
.
Usage on Windows
When installing on Windows, this module will download the windows version of Filebeat from
elastic to C:\Temp
by default. The directory
can be overridden using the tmp_dir
parameter. tmp_dir
is not managed by this module,
but is expected to exist as a directory that puppet can write to.
Processors
Filebeat 5.0 and greater includes a new libbeat feature for filtering and/or enhancing all
exported data through processors before geing sent to the configured output(s). By populating
the processors
parameter any number of processors may be configured to work on all events
or only those that match certain conditions.
To drop the offset and input_type fields from all events:
class{"filebeat":
processors => [
{
"name" => "drop_fields",
"params" => {"fields" => ["input_type", "offset"]}
},
],
}
To drop all events that have the http response code equal to 200:
class{"filebeat":
processors => [
{
"name" => "drop_event",
"when" => {"equals" => {"http.code" => 200}}
},
],
}
Now to combine these examples into a single definition:
class{"filebeat":
processors => [
{
"name" => "drop_fields",
"params" => {"fields" => ["input_type", "offset"]}
},
{
"name" => "drop_event",
"when" => {"equals" => {"http.code" => 200}}
},
],
}
For more information please review the documentation here.
Reference
Public Classes
Class: filebeat
Installs and configures filebeat.
Parameters within filebeat
major_version
: [String] The major version of filebeat to install. Should be either undef, 1, or 5. (default 5 if 1 not already installed)package_ensure
: [String] The ensure parameter for the filebeat package (default: present)manage_repo
: [Boolean] Whether or not the upstream (elastic) repo should be configured or not (default: true)service_ensure
: [String] The ensure parameter on the filebeat service (default: running)service_enable
: [String] The enable parameter on the filebeat service (default: true)service_provider
: [String] The provider parameter on the filebeat service (default: on RedHat based systems use redhat, otherwise undefined)spool_size
: [Integer] How large the spool should grow before being flushed to the network (default: 2048)idle_timeout
: [String] How often the spooler should be flushed even if spool size isn't reached (default: 5s)publish_async
: [Boolean] If set to true filebeat will publish while preparing the next batch of lines to transmit (defualt: false)registry_file
: [String] The registry file used to store positions, absolute or relative to working directory (default .filebeat)config_file
: [String] Where the configuration file managed by this module should be placed. If you think you might want to use this, read the limitations first. Defaults to the location that filebeat expects for your operating system.config_dir
: [String] The directory where prospectors should be defined (default: /etc/filebeat/conf.d)config_dir_mode
: [String] The permissions mode set on the configuration directory (default: 0755)config_file_mode
: [String] The permissions mode set on configuration files (default: 0644)purge_conf_dir
: [Boolean] Should files in the prospector configuration directory not managed by puppet be automatically purgedoutputs
: [Hash] Will be converted to YAML for the required outputs section of the configuration (see documentation, and above)shipper
: [Hash] Will be converted to YAML to create the optional shipper section of the filebeat config (see documentation)logging
: [Hash] Will be converted to YAML to create the optional logging section of the filebeat config (see documentation)conf_template
: [String] The configuration template to use to generate the main filebeat.yml config filedownload_url
: [String] The URL of the zip file that should be downloaded to install filebeat (windows only)install_dir
: [String] Where filebeat should be installed (windows only)tmp_dir
: [String] Where filebeat should be temporarily downloaded to so it can be installed (windows only)use_generic_template
: [Boolean] Use a more generic version of the configuration template. The generic template is more future proof (if types are correct), but looks very different than the example file (default: false)shutdown_timeout
: [String] How long filebeat waits on shutdown for the publisher to finish sending eventsbeat_name
: [String] The name of the beat shipper (default: hostname)tags
: [Array] A list of tags that will be included with each published transactionqueue_size
: [String] The internal queue size for events in the pipelinemax_procs
: [Number] The maximum number of CPUs that can be simultaneously usedfields
: [Hash] Optional fields that should be added to each event outputfields_under_root
: [Boolean] If set to true, custom fields are stored in the top level instead of under fieldsprospectors
: [Hash] Prospectors that will be created. Commonly used to create prospectors using hieraprospectors_merge
: [Boolean] If true,hiera_hash()
will be used to build the theprospectors
parameter (default: false)
Private Classes
Class: filebeat::config
Creates the configuration files required for filebeat (but not the prospectors)
Class: filebeat::install
Calls the correct installer class based on the kernel fact.
Class: filebeat::params
Sets default parameters for filebeat
based on the OS and other facts.
Class: filebeat::repo
Installs the yum or apt repository for the system package manager to install filebeat.
Class: filebeat::service
Configures and manages the filebeat service.
Class: filebeat::install::linux
Install the filebeat package on Linux kernels.
Class: filebeat::install::windows
Downloads, extracts, and installs the filebeat zip file in Windows.
Public Defines
Define: filebeat::prospector
Installs a configuration file for a prospector.
Be sure to read the filebeat configuration details to fully understand what these parameters do.
Parameters for filebeat::prospector
ensure
: The ensure parameter on the prospector configuration file. (default: present)paths
: [Array] The paths, or blobs that should be handled by the prospector. (required)exclude_files
: [Array] Files that match any regex in the list are excluded from filebeat (default: [])encoding
: [String] The file encoding. (default: plain)input_type
: [String] log or stdin - where filebeat reads the log from (default:log)fields
: [Hash] Optional fields to add information to the output (default: {})fields_under_root
: [Boolean] Should thefields
parameter fields be stored at the top level of indexed documents.ignore_older
: [String] Files older than this field will be ignored by filebeat (default: 24h in filebeat < 1.2.0, infinite in filebeat >= 1.2.0)close_older
: [String] Files that haven't been modified sinceclose_older
, they'll be closed. New modifications will be read when files are scanned again according toscan_frequency
. Introduced in filebeat 1.2.0 (default: 1h)log_type
: [String] (Deprecated - usedoc_type
) The document_type setting (optional - default: log)doc_type
: [String] The event type to used for published lines, used as type field in logstash and elasticsearch (optional - default: log)scan_frequency
: [String] How often should the prospector check for new files (default: 10s)harvester_buffer_size
: [Integer] The buffer size the harvester uses when fetching the file (default: 16384)tail_files
: [Boolean] If true, filebeat starts reading new files at the end instead of the beginning (default: false)backoff
: [String] How long filebeat should wait between scanning a file after reaching EOF (default: 1s)max_backoff
: [String] The maximum wait time to scan a file for new lines to ship (default: 10s)backoff_factor
: [Integer]backoff
is multiplied by this parameter untilmax_backoff
is reached to determine the actual backoff (default: 2)force_close_files
: [Boolean] Should filebeat forcibly close a file when renamed (default: false)include_lines
: [Array] A list of regular expressions to match the lines that you want to include. Ignored if empty (default: [])exclude_lines
: [Array] A list of regular expressions to match the files that you want to exclude. Ignored if empty (default: [])max_bytes
: [Integer] The maximum number of bytes that a single log message can have (default: 10485760)json
: [Hash] Options that control how filebeat handles decoding of log messages in JSON format See above. (default: {})multiline
: [Hash] Options that control how Filebeat handles log messages that span multiple lines. See above. (default: {})
Limitations
This module doesn't load the elasticsearch index template into elasticsearch (required when shipping directly to elasticsearch).
When installing on Windows, there's an expectation that C:\Temp
already exists, or an alternative
location specified in the tmp_dir
parameter exists and is writable by puppet. The temp directory
is used to store the downloaded installer only.
Registry Path
The default registry file in this module doesn't match the filebeat default, but moving the file
while the filbeat service is running can cause data duplication or data loss. If you're installing
filebeat for the first time you should consider setting registry_file
to match the
default.
Be sure to include a path or the file will be put at the root of your filesystem.
Debian Systems
Filebeat 5.x and newer requires apt-transport-https, but this module won't install it for you.
Pre-1.9.1 Ruby
If you're on a system running a Ruby pre-1.9.1, hashes aren't sorted consistently, causing puppet runs to not be idempotent. To fix this, a limited template is used if the rubyversion is pre-1.9.1. The limited template only supports elasticsearch, logstash, file, and console outputs, and not all options may be supported (there is no warning when an option is omitted). Unlike with newer rubies, as new versions of filebeat are released, this template may not work until it's updated, even if you're using an updated configuration hash.
If you don't care about keeping puppet idempotent, this can be overridden by setting the conf_template
parameter to 'filebeat/filebeat.yml.erb'.
See templates/filebeat.yml.ruby18.erb for the all of the details.
Using config_file
There are a few very specific use cases where you don't want this module to directly manage the filebeat
configuration file, but you still want the configuration file on the system at a different location.
Setting config_file
will write the filebeat configuration file to an alternate location, but it will not
update the init script. If you don't also manage the correct file (/etc/filebeat/filebeat.yml on Linux,
C:/Program Files/Filebeat/filebeat.yml on Windows) then filebeat won't be able to start.
If you're copying the alternate config file location into the real location you'll need to include some metaparameters like
file { '/etc/filebeat/filebeat.yml':
ensure => file,
source => 'file:///etc/filebeat/filebeat.special',
require => File['filebeat.yml'],
notify => Service['filebeat'],
}
to ensure that services are managed like you might expect.
Development
Pull requests and bug reports are welcome. If you're sending a pull request, please consider writing tests if applicable.
Changelog
Unreleased
v0.10.1
v0.10.0
- Add support for JSON decoding \72
v0.9.2
- Add support for close* and clean* parameters in prospectors #70
v0.9.1
- Fix yaml syntax around filebeat processors #71
v0.9.0
- Add support for tags in prospectors #68
- Add support for filebeat processors #69
- Fix the
filebeat_version
fact in Windows #59 - Validate configuration files before notifying the filebeat service
- Update the Windows install URL to the latest version
v0.8.7
- Update windows URL to the latest 5.x release
- Remove nil values before rendering the template #65
v0.8.6
v0.8.5
- Check the kafka partition hash before checking for sub-hashes #54
v0.8.4
- Fix regression: Add the SSL label to the filebeat 5 template. #53
v0.8.3
- Don't use a possibly undefined array's length to determine if it should be iterated over #52
v0.8.2
- Correctly set document type for v5 prospectors #51
v0.8.1
- Don't manage the apt-transport-https package on Debian systems #49
- undefined values shouldn't be rendered by the filebeat5 template #50
v0.8.0
Enhancements
- Add support for Filebeat v5.
If you use this module on a system with filebeat 1.x installed, and you keep your current parameters
nothing will change. Setting major_version
to '5' will modify the configuration template and update
package repositories, but won't update the package itself. To update the package set the
package_ensure
parameter to at least 5.0.0.
- Add a parameter
use_generic_template
that uses a more generic version of the configuration template. The generic template is more future proof (if types are correct), but looks very different than the example file.
v0.7.4
Version 0.7.3 was never released even though it is tagged.
- Fixed some testing issues that were caused by changes to external resources
Fixed Bugs
- Some redis configuration options were not generated as integers #38
v0.7.2
- Wrap regular expressions in single quotes #31 and #35
- Use the default Windows temporary folder (C:\Windows\Temp) by default #33
v0.7.1
- Allow the config file to be written to an alternate location. Be sure and read limitations before you use this.
Fixed Bugs
- Add elasticsearch and logstash port setting to Ruby 1.8 template #29
v0.7.0
- Setting the
prospectors_merge
parameter to true will create prospectors across multiple hiera levels usinghiera_hash()
#25 - No longer manage the windows temp directory where the Filebeat download is kept. The assumption is made that the directory exists and is writable by puppet.
- Update the default windows download to Filebeat version 1.2.3
- Add redis output to the Ruby 1.8 template
- Wrap include_lines and exclude_lines array elements in quotes #28
Fixed Bugs
- SLES repository and metaparameters didn't match #25
v0.6.3
Fixed Bugs
- Spool size default should match upstream #24
- Repository names now match notification parameters Part of #25
v0.6.2
Fixed Bugs
- Fix the other certificate_key typo in Ruby 1.8 template #23
v0.6.1
Fixed Bugs
- Fix typo in Ruby 1.8 template #23
v0.6.0
- Add the
close_older
parameter to support the option of the same name in filebeat 1.2.0 - Add support for the
publish_async
parameter.
Fixed Bugs
- Added limited, but improved support for Ruby versions pre-1.9.1 by fixing the hash sort issue #20
v0.5.8
Fixed Bugs
doc_type
is now used in the documentation instead of the deprecatedlog_type
#17- RedHat based systems should be using the redhat service provider. #18
v0.5.7
Fixed Bugs
- Some configuration parameters should be rendered as integers, not strings #15
v0.5.6
Fixed Bugs
- Configuration files should use the
conf_template
parameter #14
v0.5.5
Fixed Bugs
rotate_every_kb
andnumber_of_files
parameters in file outputs should be explicitly integers to keep filebeat happy. #13
v0.5.4
Fixed Bugs
- Fix template regression in v0.5.3
v0.5.2
- Use the anchor pattern instead of contain so that older versions of puppet are supported #12
v0.5.1
- Update metadata to reflect which versions of puppet are supported.
v0.5.0
- For prospectors, deprecate
log_type
in favor ofdoc_type
to better match the actual configuration parameter.document_type
is not used because it causes errors when running with a puppet master.log_type
will be fully removed before module version 1.0. #9
New Features
- Add support for
exclude_files
,exclude_lines
,include_lines
, andmultiline
. Use of the new parameters requires a filebeat version >= 1.1 (#10, #11)
v0.4.1
Fixed Bugs
- Fix links in documentation to match the updated documentation
New Features
- Change repository resource names to beats (e.g. apt::source['beats'], etc.), and only declare them if they haven't already been declared. This way we only have one module for all beats modules managed through puppet.
v0.4.0
This is the first release that includes changelog. Since v0.3.1:
Fixed Bugs
- 'fields' parse error in prospector.yml template #7
New Features
- Windows support #3
- Requires the
puppetlabs/powershell
andlwf/remote_file
modules.
- Requires the
- Config file and folder permissions can be managed #8
Dependencies
- puppetlabs/stdlib (>=4.6.0 <5.0.0)
- puppetlabs/apt (>=2.0.0 <3.0.0)
- puppetlabs/powershell (>= 1.0.1 < 2.0.0)
- lwf/remote_file (>= 0.2.0 < 2.0.0)
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.