fluentd 1.11.1-x86-mingw32 → 1.12.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. data/.github/workflows/stale-actions.yml +22 -0
  5. data/.travis.yml +22 -2
  6. data/CHANGELOG.md +111 -0
  7. data/README.md +1 -1
  8. data/appveyor.yml +3 -0
  9. data/bin/fluent-cap-ctl +7 -0
  10. data/bin/fluent-ctl +7 -0
  11. data/example/copy_roundrobin.conf +3 -3
  12. data/example/counter.conf +1 -1
  13. data/example/filter_stdout.conf +2 -2
  14. data/example/{in_dummy_blocks.conf → in_sample_blocks.conf} +4 -4
  15. data/example/{in_dummy_with_compression.conf → in_sample_with_compression.conf} +3 -3
  16. data/example/logevents.conf +5 -5
  17. data/example/multi_filters.conf +1 -1
  18. data/example/out_exec_filter.conf +2 -2
  19. data/example/out_forward.conf +1 -1
  20. data/example/out_forward_buf_file.conf +1 -1
  21. data/example/out_forward_client.conf +5 -5
  22. data/example/out_forward_heartbeat_none.conf +1 -1
  23. data/example/out_forward_sd.conf +1 -1
  24. data/example/out_forward_shared_key.conf +2 -2
  25. data/example/out_forward_tls.conf +1 -1
  26. data/example/out_forward_users.conf +3 -3
  27. data/example/out_null.conf +4 -4
  28. data/example/secondary_file.conf +1 -1
  29. data/fluentd.gemspec +7 -6
  30. data/lib/fluent/capability.rb +87 -0
  31. data/lib/fluent/command/cap_ctl.rb +174 -0
  32. data/lib/fluent/command/ctl.rb +177 -0
  33. data/lib/fluent/command/plugin_config_formatter.rb +2 -1
  34. data/lib/fluent/env.rb +4 -0
  35. data/lib/fluent/log.rb +33 -3
  36. data/lib/fluent/match.rb +9 -0
  37. data/lib/fluent/plugin.rb +5 -0
  38. data/lib/fluent/plugin/buffer.rb +32 -42
  39. data/lib/fluent/plugin/buffer/chunk.rb +2 -1
  40. data/lib/fluent/plugin/formatter.rb +24 -0
  41. data/lib/fluent/plugin/formatter_csv.rb +1 -1
  42. data/lib/fluent/plugin/formatter_hash.rb +3 -1
  43. data/lib/fluent/plugin/formatter_json.rb +3 -1
  44. data/lib/fluent/plugin/formatter_ltsv.rb +5 -3
  45. data/lib/fluent/plugin/formatter_out_file.rb +6 -4
  46. data/lib/fluent/plugin/formatter_single_value.rb +4 -2
  47. data/lib/fluent/plugin/formatter_tsv.rb +4 -2
  48. data/lib/fluent/plugin/in_dummy.rb +2 -123
  49. data/lib/fluent/plugin/in_exec.rb +4 -2
  50. data/lib/fluent/plugin/in_http.rb +25 -4
  51. data/lib/fluent/plugin/in_sample.rb +141 -0
  52. data/lib/fluent/plugin/in_tail.rb +109 -41
  53. data/lib/fluent/plugin/in_tail/position_file.rb +39 -14
  54. data/lib/fluent/plugin/in_tcp.rb +1 -0
  55. data/lib/fluent/plugin/out_http.rb +20 -2
  56. data/lib/fluent/plugin/output.rb +15 -6
  57. data/lib/fluent/plugin/parser_json.rb +5 -2
  58. data/lib/fluent/plugin_helper/cert_option.rb +5 -8
  59. data/lib/fluent/plugin_helper/http_server/compat/server.rb +1 -1
  60. data/lib/fluent/plugin_helper/inject.rb +4 -1
  61. data/lib/fluent/plugin_helper/retry_state.rb +4 -0
  62. data/lib/fluent/plugin_helper/socket.rb +1 -1
  63. data/lib/fluent/supervisor.rb +151 -48
  64. data/lib/fluent/system_config.rb +2 -1
  65. data/lib/fluent/time.rb +1 -0
  66. data/lib/fluent/version.rb +1 -1
  67. data/lib/fluent/winsvc.rb +22 -4
  68. data/test/command/test_binlog_reader.rb +22 -6
  69. data/test/command/test_cap_ctl.rb +100 -0
  70. data/test/command/test_ctl.rb +57 -0
  71. data/test/command/test_plugin_config_formatter.rb +57 -2
  72. data/test/plugin/in_tail/test_position_file.rb +45 -25
  73. data/test/plugin/test_buffer.rb +4 -0
  74. data/test/plugin/test_filter_stdout.rb +6 -1
  75. data/test/plugin/test_formatter_hash.rb +6 -3
  76. data/test/plugin/test_formatter_json.rb +14 -4
  77. data/test/plugin/test_formatter_ltsv.rb +13 -5
  78. data/test/plugin/test_formatter_out_file.rb +35 -14
  79. data/test/plugin/test_formatter_single_value.rb +12 -6
  80. data/test/plugin/test_formatter_tsv.rb +12 -4
  81. data/test/plugin/test_in_exec.rb +18 -0
  82. data/test/plugin/test_in_http.rb +25 -0
  83. data/test/plugin/{test_in_dummy.rb → test_in_sample.rb} +25 -25
  84. data/test/plugin/test_in_tail.rb +433 -30
  85. data/test/plugin/test_out_file.rb +23 -18
  86. data/test/plugin/test_output.rb +12 -0
  87. data/test/plugin/test_parser_syslog.rb +2 -2
  88. data/test/plugin_helper/data/cert/empty.pem +0 -0
  89. data/test/plugin_helper/test_cert_option.rb +7 -0
  90. data/test/plugin_helper/test_compat_parameters.rb +7 -2
  91. data/test/plugin_helper/test_http_server_helper.rb +5 -0
  92. data/test/plugin_helper/test_inject.rb +42 -0
  93. data/test/plugin_helper/test_server.rb +34 -0
  94. data/test/plugin_helper/test_socket.rb +8 -0
  95. data/test/test_capability.rb +74 -0
  96. data/test/test_formatter.rb +34 -10
  97. data/test/test_log.rb +44 -0
  98. data/test/test_match.rb +11 -0
  99. data/test/test_output.rb +6 -1
  100. data/test/test_static_config_analysis.rb +2 -2
  101. data/test/test_supervisor.rb +119 -1
  102. metadata +50 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c5c0bb8a881ac7bdbad86f9261310b8d3e7f505c3ec085594237a6f01b6bd2b3
4
- data.tar.gz: 5436e5d40545b9c3131abd63eeb33a94663ea8c98bd492b3b1d1d92ddfd616c7
3
+ metadata.gz: cdc76f6f11cb61d39493ea75cf0c0a473f9cf8f2aeb52904b33611cddb2f7e59
4
+ data.tar.gz: e47317af7d0e5d22b6dd54e1ad3c23a77652ed3441851549699b7f8f2f7577f0
5
5
  SHA512:
6
- metadata.gz: 0ba7de652d79100f15bd5c921d233260fa8ce97d4c89dde51a2c4c1ea76bc8ef363e76a51bb179634e0d9e30edea0bbf2f80f4fe8cca0baea1e2d1c4964664f3
7
- data.tar.gz: 7273f92710cab57e9368623641efcd31bcd9aced03db45eb5f9316466ffaae0209725800d35abc1c522428ebf7b4280a9a8a812793dfa1a2909ab2db74eb80a4
6
+ metadata.gz: 55a69af50c96ab66919f00f488558353bddbb799682f1987a4e1bcef68ef93e28a9bd721735306c4aad21fd85e08f233ebf4aff79f81b42a61ced3c5fe39119e
7
+ data.tar.gz: c5a4da161a352b210cb9c57bb6f5119f2131ca86f107924bd1f45e65ed924d2e483ebe94559a80e8e054fc88badffeb53785bc65097ea903fddff3ec3ca1d811
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Bug Report
3
- about: Create a report to help us improve. If you have questions about Fluentd and plugins, please direct these to https://groups.google.com/forum/#!forum/fluentd
3
+ about: Create a report with a procedure for reproducing the bug
4
4
 
5
5
  ---
6
6
 
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Ask a Question
4
+ url: https://groups.google.com/forum/#!forum/fluentd
5
+ about: I have questions about Fluentd and plugins. Please ask and answer questions here
@@ -0,0 +1,22 @@
1
+ name: "Mark or close stale issues and PRs"
2
+ on:
3
+ schedule:
4
+ - cron: "00 10 * * *"
5
+
6
+ jobs:
7
+ stale:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/stale@v3
11
+ with:
12
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
13
+ days-before-stale: 90
14
+ days-before-close: 30
15
+ stale-issue-message: "This issue has been automatically marked as stale because it has been open 90 days with no activity. Remove stale label or comment or this issue will be closed in 30 days"
16
+ stale-pr-message: "This PR has been automatically marked as stale because it has been open 90 days with no activity. Remove stale label or comment or this PR will be closed in 30 days"
17
+ close-issue-message: "This issue was automatically closed because of stale in 30 days"
18
+ close-pr-message: "This PR was automatically closed because of stale in 30 days"
19
+ stale-pr-label: "stale"
20
+ stale-issue-label: "stale"
21
+ exempt-issue-labels: "bug,enhancement,feature request,pending,work_in_progress,v1,v2"
22
+ exempt-pr-labels: "bug,enhancement,feature request,pending,work_in_progress,v1,v2"
@@ -9,44 +9,63 @@ matrix:
9
9
  include:
10
10
  - rvm: 2.4.9
11
11
  os: linux
12
+ env: USE_CAPNG=false
12
13
  - rvm: 2.4.9
13
14
  os: linux-ppc64le
15
+ env: USE_CAPNG=false
14
16
  - rvm: 2.5.7
15
17
  os: linux
18
+ env: USE_CAPNG=false
16
19
  - rvm: 2.5.7
17
20
  os: linux
18
21
  arch: s390x
19
22
  dist: xenial
23
+ env: USE_CAPNG=false
20
24
  - rvm: 2.6.5
21
25
  os: linux
26
+ env: USE_CAPNG=false
27
+ - rvm: 2.6.6
28
+ os: linux
29
+ env: USE_CAPNG=true
22
30
  - rvm: 2.7.0
23
31
  os: linux
32
+ env: USE_CAPNG=false
24
33
  - rvm: ruby-head
25
34
  os: linux
35
+ env: USE_CAPNG=false
26
36
  - rvm: ruby-head
27
37
  os: linux-ppc64le
38
+ env: USE_CAPNG=false
28
39
  - rvm: 2.4.6
29
40
  os: osx
30
41
  osx_image: xcode8.3 # OSX 10.12
42
+ env: USE_CAPNG=false
31
43
  - rvm: ruby-head
32
44
  os: osx
33
45
  osx_image: xcode8.3 # OSX 10.12
46
+ env: USE_CAPNG=false
34
47
  allow_failures:
35
48
  - rvm: 2.4.6
36
49
  os: osx
37
50
  osx_image: xcode8.3
51
+ env: USE_CAPNG=false
38
52
  - rvm: 2.5.7
39
53
  os: linux
40
54
  arch: s390x
41
55
  dist: xenial
56
+ env: USE_CAPNG=false
42
57
  - rvm: ruby-head
58
+ env: USE_CAPNG=false
43
59
 
44
60
  branches:
45
61
  only:
46
62
  - master
47
63
 
48
- before_install:
49
- - gem update --system=3.1.2
64
+ before_install: |
65
+ gem update --system=3.1.2
66
+ if [[ x"${USE_CAPNG}" == "xtrue" ]]; then
67
+ echo 'gem "capng_c"' >> Gemfile.local
68
+ fi
50
69
 
51
70
  sudo: false
52
71
  dist: trusty # for TLSv1.2 support
@@ -55,3 +74,4 @@ addons:
55
74
  apt:
56
75
  packages:
57
76
  - libgmp3-dev
77
+ - libcap-ng-dev
@@ -1,5 +1,116 @@
1
+ # v1.12
2
+
3
+ ## Release v1.12.0 - 2020/01/05
4
+
5
+ ### New feature
6
+
7
+ * in_tail: Add `follow_inode` to support log rotation with wild card
8
+ https://github.com/fluent/fluentd/pull/2992
9
+ * in_tail: Handle linux capability
10
+ https://github.com/fluent/fluentd/pull/3155
11
+ https://github.com/fluent/fluentd/pull/3162
12
+ * windows: Add win32 events alternative to unix signals
13
+ https://github.com/fluent/fluentd/pull/3131
14
+
15
+ ### Enhancement
16
+
17
+ * buffer: Enable metadata comparison optimization on all platform
18
+ https://github.com/fluent/fluentd/pull/3095
19
+ * fluent-plugin-config-formatter: Handle `service_discovery` type
20
+ https://github.com/fluent/fluentd/pull/3178
21
+ * in_http: Add `add_query_params` parameter to add query params to event record
22
+ https://github.com/fluent/fluentd/pull/3197
23
+ * inject: Support `unixtime_micros` and `unixtime_nanos` in `time_type`
24
+ https://github.com/fluent/fluentd/pull/3220
25
+ * Refactoring code
26
+ https://github.com/fluent/fluentd/pull/3167
27
+ https://github.com/fluent/fluentd/pull/3170
28
+ https://github.com/fluent/fluentd/pull/3180
29
+ https://github.com/fluent/fluentd/pull/3196
30
+ https://github.com/fluent/fluentd/pull/3213
31
+ https://github.com/fluent/fluentd/pull/3222
32
+
33
+ ### Bug fix
34
+
35
+ * output: Prevent retry.step from being called too many times in a short time
36
+ https://github.com/fluent/fluentd/pull/3203
37
+
1
38
  # v1.11
2
39
 
40
+ ## Release v1.11.5 - 2020/11/06
41
+
42
+ ### Enhancement
43
+
44
+ * formatter: Provide `newline` parameter to support `CRLF`
45
+ https://github.com/fluent/fluentd/pull/3152
46
+ * out_http: adding support for intermediate certificates
47
+ https://github.com/fluent/fluentd/pull/3146
48
+ * Update serverengine dependency to 2.2.2 or later
49
+
50
+ ### Bug fix
51
+
52
+ * Fix a bug that windows service isn't stopped gracefuly
53
+ https://github.com/fluent/fluentd/pull/3156
54
+
55
+ ## Release v1.11.4 - 2020/10/13
56
+
57
+ ### Enhancement
58
+
59
+ * inject: Support `unixtime_millis` in `time_type` parameter
60
+ https://github.com/fluent/fluentd/pull/3145
61
+
62
+ ### Bug fix
63
+
64
+ * out_http: Fix broken data with `json_array true`
65
+ https://github.com/fluent/fluentd/pull/3144
66
+ * output: Fix wrong logging issue for `${chunk_id}`
67
+ https://github.com/fluent/fluentd/pull/3134
68
+
69
+ ## Release v1.11.3 - 2020/09/30
70
+
71
+ ### Enhancement
72
+
73
+ * in_exec: Add `connect_mode` parameter to read stderr
74
+ https://github.com/fluent/fluentd/pull/3108
75
+ * parser_json: Improve the performance
76
+ https://github.com/fluent/fluentd/pull/3109
77
+ * log: Add `ignore_same_log_interval` parameter
78
+ https://github.com/fluent/fluentd/pull/3119
79
+ * Upgrade win32 gems
80
+ https://github.com/fluent/fluentd/pull/3100
81
+ * Refactoring code
82
+ https://github.com/fluent/fluentd/pull/3094
83
+ https://github.com/fluent/fluentd/pull/3118
84
+
85
+ ### Bug fix
86
+
87
+ * buffer: Fix calculation of timekey stats
88
+ https://github.com/fluent/fluentd/pull/3018
89
+ * buffer: fix binmode usage for prevent gc
90
+ https://github.com/fluent/fluentd/pull/3138
91
+
92
+ ## Release v1.11.2 - 2020/08/04
93
+
94
+ ### Enhancement
95
+
96
+ * `in_dummy` renamed to `in_sample`
97
+ https://github.com/fluent/fluentd/pull/3065
98
+ * Allow regular expression in filter/match directive
99
+ https://github.com/fluent/fluentd/pull/3071
100
+ * Refactoring code
101
+ https://github.com/fluent/fluentd/pull/3051
102
+
103
+ ### Bug fix
104
+
105
+ * buffer: Fix log message for `chunk_limit_records` case
106
+ https://github.com/fluent/fluentd/pull/3079
107
+ * buffer: Fix timekey optimization for non-windows platform
108
+ https://github.com/fluent/fluentd/pull/3092
109
+ * cert: Raise an error for broken certificate file
110
+ https://github.com/fluent/fluentd/pull/3086
111
+ * cert: Set TLS ciphers list correcty on older OpenSSL
112
+ https://github.com/fluent/fluentd/pull/3093
113
+
3
114
  ## Release v1.11.1 - 2020/06/22
4
115
 
5
116
  ### Enhancement
data/README.md CHANGED
@@ -13,7 +13,7 @@ Drone CI for Arm64:
13
13
  [Fluentd](https://www.fluentd.org/) collects events from various data sources and writes them to files, RDBMS, NoSQL, IaaS, SaaS, Hadoop and so on. Fluentd helps you unify your logging infrastructure (Learn more about the [Unified Logging Layer](https://www.fluentd.org/blog/unified-logging-layer)).
14
14
 
15
15
  <p align="center">
16
- <img src="https://raw.githubusercontent.com/fluent/fluentd-docs-gitbook/1.0/images/fluentd-architecture.png" width="500px"/>
16
+ <img src="https://www.fluentd.org/images/fluentd-architecture.png" width="500px"/>
17
17
  </p>
18
18
 
19
19
  An event consists of *tag*, *time* and *record*. Tag is a string separated with '.' (e.g. myapp.access). It is used to categorize events. Time is a UNIX time recorded at occurrence of an event. Record is a JSON object.
@@ -7,6 +7,9 @@ install:
7
7
  - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
8
8
  - ruby --version
9
9
  - gem --version
10
+ # stay 0.14.0 for Windows CI until https://github.com/socketry/protocol-http2/issues/6 will be fixed
11
+ - ps: Write-Output "gem 'protocol-http2', ['<= 0.14.0']" | Out-File -FilePath Gemfile.local -Encoding default
12
+ - type Gemfile.local
10
13
  - ridk.cmd exec bundle install
11
14
  build: off
12
15
  test_script:
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ here = File.dirname(__FILE__)
4
+ $LOAD_PATH << File.expand_path(File.join(here, '..', 'lib'))
5
+ require 'fluent/command/cap_ctl'
6
+
7
+ Fluent::CapCtl.new.call
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ here = File.dirname(__FILE__)
4
+ $LOAD_PATH << File.expand_path(File.join(here, '..', 'lib'))
5
+ require 'fluent/command/ctl'
6
+
7
+ Fluent::Ctl.new.call
@@ -1,12 +1,12 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  @label @test
4
4
  tag test.copy
5
5
  auto_increment_key id
6
6
  </source>
7
7
 
8
8
  <source>
9
- @type dummy
9
+ @type sample
10
10
  @label @test
11
11
  tag test.rr
12
12
  auto_increment_key id
@@ -36,4 +36,4 @@
36
36
  output_type ltsv
37
37
  </store>
38
38
  </match>
39
- </label>
39
+ </label>
@@ -8,7 +8,7 @@
8
8
  </system>
9
9
 
10
10
  <source>
11
- @type dummy
11
+ @type sample
12
12
  tag "test.data"
13
13
  auto_increment_key number
14
14
  </source>
@@ -1,6 +1,6 @@
1
1
  <source>
2
- @type dummy
3
- tag dummy
2
+ @type sample
3
+ tag sample
4
4
  </source>
5
5
 
6
6
  <filter **>
@@ -1,11 +1,11 @@
1
1
  <source>
2
- @type dummy
3
- tag dummy
2
+ @type sample
3
+ tag sample
4
4
  rate 100
5
- dummy {"message":"yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay"}
5
+ sample {"message":"yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay"}
6
6
  </source>
7
7
 
8
- <match dummy>
8
+ <match sample>
9
9
  @type null
10
10
  never_flush true
11
11
  <buffer>
@@ -1,16 +1,16 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  @label @main
4
4
  tag "test.data"
5
5
  size 2
6
6
  rate 10
7
- dummy {"message":"yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay"}
7
+ sample {"message":"yaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay"}
8
8
  auto_increment_key number
9
9
  </source>
10
10
 
11
11
  <label @main>
12
12
  <match test.data>
13
- @type buffered_stdout
13
+ @type stdout
14
14
  <buffer>
15
15
  @type file
16
16
  path "#{Dir.pwd}/compressed_buffers"
@@ -1,10 +1,10 @@
1
1
  <source>
2
- @type dummy
3
- @label @dummylog
2
+ @type sample
3
+ @label @samplelog
4
4
  tag "data"
5
- dummy {"message":"yay"}
5
+ sample {"message":"yay"}
6
6
  </source>
7
- <label @dummylog>
7
+ <label @samplelog>
8
8
  <match **>
9
9
  @type stdout
10
10
  </match>
@@ -22,4 +22,4 @@
22
22
  # hostname_key "host"
23
23
  # </inject>
24
24
  # </match>
25
- </label>
25
+ </label>
@@ -1,7 +1,7 @@
1
1
  # This example is to measure optimized filter pipeline performance.
2
2
 
3
3
  <source>
4
- @type dummy
4
+ @type sample
5
5
  tag test
6
6
  size 1000
7
7
  </source>
@@ -1,10 +1,10 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  @label @exec
4
4
  tag exec_input
5
5
  rate 10
6
6
  auto_increment_key num
7
- dummy {"data":"mydata"}
7
+ sample {"data":"mydata"}
8
8
  </source>
9
9
 
10
10
  <label @exec>
@@ -1,5 +1,5 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  tag test
4
4
  </source>
5
5
 
@@ -1,5 +1,5 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  tag test
4
4
  </source>
5
5
 
@@ -1,21 +1,21 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  tag test
4
4
  </source>
5
5
  <source>
6
- @type dummy
6
+ @type sample
7
7
  tag test2
8
8
  </source>
9
9
  <source>
10
- @type dummy
10
+ @type sample
11
11
  tag test3
12
12
  </source>
13
13
  <source>
14
- @type dummy
14
+ @type sample
15
15
  tag test4
16
16
  </source>
17
17
  <source>
18
- @type dummy
18
+ @type sample
19
19
  tag test5
20
20
  </source>
21
21
 
@@ -1,5 +1,5 @@
1
1
  <source>
2
- @type dummy
2
+ @type sample
3
3
  tag test
4
4
  </source>
5
5