рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ * RRDtool рдХреЗ рд╕рд╛рде рдирд┐рдХреНрд╕ рдЪрд▓ рд░рд╣рд╛ рд╣реИ



рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛%! рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреИрд╕реЗ рдмрдврд╝рд╛рдПрдВ - рдЖрд░рдЖрд░рдбреАрдЯреВрд▓ред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдФрд░ рд░реЗрдЦрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИ: рд╕реАрдкреАрдпреВ рд▓реЛрдб, рдореЗрдореЛрд░реА рд╕реНрдЯреЗрдЯрд╕, рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд▓реЛрдб, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рддрд╛рдкрдорд╛рди рд╡рд┐рднрд┐рдиреНрди рд╕рдордп рдХреЗ рд▓рд┐рдПред

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдПрдХ рдмрд┐рдЯред RRDtool - рд░рд┐рдВрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯред рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ (рдиреЗрдЯрд╡рд░реНрдХ рдЯреНрд░реИрдлрд╝рд┐рдХ, рд╕реАрдкреАрдпреВ рд▓реЛрдб) рдХреЗ рд╕рдордп-рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ - рдмрд╕ рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕рд╛рдореВрд╣рд┐рдХ рдбреЗрдореЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдореЙрди рд╣реИ рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рддред рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд░рд┐рдВрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ RRDtool рдХреА рдорджрдж рд╕реЗ рд╣рдо рдЧреНрд░рд╛рдл рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд░реЗрдЦрд╛рдВрдХрди рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдЗрдП рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдПрдХ рддрд╛рдЬрд╝рд╛ рд╕реНрдерд╛рдкрд┐рдд рдбреЗрдмрд┐рдпрди 7 рдордЯреНрдард╛ рдкрд░ рдХрд┐рдП рдЧрдП:

root@kd-ast:/etc/collectd# uname -a
Linux kd-ast 3.2.0-4-686-pae #1 SMP Debian 3.2.46-1 i686 GNU/Linux


рд░реЗрдЦрд╛рдВрдХрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ RRDtool рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

apt-get install rrdtool

рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдирд╛
рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХрд▓реЗрдХреНрдЯ рдбреЗрдореЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

apt-get install collectd

рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ:

cd /usr/sbin/
./collectd onestart


рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо /var/lib/collectd/router.local рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд╣рд╛рдБ "router.local" рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд╛рдо рд╣реИред
рдЕрдм рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд╣реА рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЧреНрд░рд╛рдл рдмрдиреЗрдВрдЧреЗ:

 #!/bin/sh ### CPU /usr/bin/rrdtool graph /var/www/monitor/cpu0.png \ #  RRDtoll      -e now \ -s 'end - 6 hours' \ -S 60 \ --title "CPU USAGE: AMD Athlon(tm) II X3 455 Processor" \ #CPU --vertical-label "Percents" \ --imgformat PNG \ --slope-mode \ --lower-limit 0 \ --upper-limit 100 \ --rigid \ -E \ -i \ --color SHADEA#FFFFFF \ --color SHADEB#FFFFFF \ --color BACK#CCCCCC \ -w 600 \ -h 150 \ --interlaced \ --font DEFAULT:8:/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf \ DEF:a=/var/lib/collectd/rrd/kd-ast/cpu-0/cpu-idle.rrd:value:MAX \ #    DEF:b=/var/lib/collectd/rrd/kd-ast/cpu-0/cpu-system.rrd:value:MAX \ DEF:c=/var/lib/collectd/rrd/kd-ast/cpu-0/cpu-user.rrd:value:MAX \ LINE2:b#2cc320: \ AREA:b#54eb48:System \ LINE2:c#e7ad4a: \ AREA:c#ebd648:User #LINE1:a#CCCCCC:Idle \ ###eth0 /usr/bin/rrdtool graph /var/www/monitor/network0.png \ -e now \ -s 'end - 6 hours' \ -S 60 \ --title 'Traffic on ext_if: eth0 (local) (100Mb/s)' \ ##   --vertical-label 'Mbyte\s' \ --imgformat PNG \ --slope-mode \ --lower-limit 0 \ --upper-limit 20000000 \ #   - max --rigid \ -E \ -i \ --color SHADEA#FFFFFF \ --color SHADEB#FFFFFF \ --color BACK#CCCCCC \ -w 600 \ -h 150 \ --interlaced \ --font DEFAULT:8:/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf \ DEF:a=/var/lib/collectd/rrd/kd-ast/interface-eth0/if_octets.rrd:tx:MAX \ DEF:b=/var/lib/collectd/rrd/kd-ast/interface-eth0/if_octets.rrd:rx:MAX \ DEF:c=/var/lib/collectd/rrd/kd-ast/interface-eth0/if_errors.rrd:tx:MAX \ AREA:a#4169E1:Tx \ LINE2:b#2cc320: \ AREA:b#54eb48:Rx \ LINE1:c#FF0000:Errors ### RAM /usr/bin/rrdtool graph /var/www/monitor/memory.png \ -e now \ -s 'end - 6 hours' \ -S 60 \ --title 'MEMORY USAGE: 2Gb' \ # RAM --vertical-label 'Mbyte' \ --imgformat PNG \ --slope-mode \ --lower-limit 0 \ --upper-limit 2000000000 \ #   --rigid \ -E \ -i \ --color SHADEA#FFFFFF \ --color SHADEB#FFFFFF \ --color BACK#CCCCCC \ -w 600 \ -h 150 \ --interlaced \ --font DEFAULT:8:/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf \ DEF:a=/var/lib/collectd/rrd/kd-ast/memory/memory-buffered.rrd:value:MAX \ #     DEF:b=/var/lib/collectd/rrd/kd-ast/memory/memory-cached.rrd:value:MAX \ DEF:c=/var/lib/collectd/rrd/kd-ast/memory/memory-free.rrd:value:MAX \ DEF:d=/var/lib/collectd/rrd/kd-ast/memory/memory-used.rrd:value:MAX \ LINE1:a#6959CD:buffered \ AREA:b#00FF00:cache \ LINE2:c#006400: \ AREA:c#00CD66:free \ AREA:d#FF1493:used \ 


рдЗрд╕реЗ рд╣рд░ рдорд┐рдирдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдХреБрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

nano /etc/crontab

*/1 * * * * root /home/sysbes/Scripts/RRDtool/mon.sh > /dev/null 2>&1

рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде index.php рдмрдирд╛рддреЗ рд╣реИрдВ:

 <html> <head> <meta charset='koi8-r'> <title>NOC</title> </head> <body bgcolor='#8FBC8F'> <br> <center> <h2><font face='Arial'>  : kd-ast</font></h2> <br><br> <center> <img src='cpu0.png'> </center><br> <center> </h2> <img src='network0.png'> </center><br> <center> </h2> <img src='memory.png'> </center><br> </body> </html> 


рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЦреЛрд▓рдХрд░ рдкрд░рд┐рдгрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: _/monitor

рддрд╛рдкрдорд╛рди рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо lm- рд╕реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдФрд░ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЬреЛ рдЖрдкрдХреЛ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рддрд╛рдкрдорд╛рди, рд╡реЛрд▓реНрдЯреЗрдЬ рдФрд░ рдкрдВрдЦреЗ рдХреА рдЧрддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реЗрдВрд╕рд░ рдХрд╛ рд╕реЗрдЯ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЖрдк mbmon рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

apt-get install lm-sensors

рд╕реЗрдВрд╕рд░ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рд╕реЗрдВрд╕рд░: рдкрддрд╛ рд▓рдЧрд╛рдПрдВ

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрд╕реЗ рдХреБрдЫ рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдЧреА - рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред

рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

рд╕реЗрдВрд╕рд░

рдпрджрд┐ рддрд╛рдкрдорд╛рди рдЧрд▓рдд рд╣реИ рдпрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдорджрдж рдорд┐рд▓реА:

modprobe it87

рдлрд┐рд░ рд╕реЗ sensors

рдпрджрд┐ рддрд╛рдкрдорд╛рди рд╕рд╣реА рд╣реИ, рддреЛ it87 рдореЙрдбреНрдпреВрд▓ рдХреЛ рдСрдЯреЛрд▓реИрдб рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

nano /etc/modules

it87


sensors

рдЕрдЧрд▓рд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧреА,
rrdtool рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдПрдХ рджрд┐рди, рд╕рдкреНрддрд╛рд╣, рдорд╣реАрдиреЗ, рд╡рд░реНрд╖ рдореЗрдВ ... рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ
рдХреНрд░реЛрди рдореЗрдВ рдФрд░ рд╡рд╣ рдЕрдкрдиреЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░реЗрдВрдЧреЗред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереА:

 #!/bin/bash RRDTOOL=/usr/bin/rrdtool #  RRDtool DATABASE=/var/lib/collectd/rrd/kd-ast/space-temperature.rrd #     PERIOD=60 SENSOR=` /usr/bin/sensors | grep temp3 | awk '{ print $2-0}'` #    IMAGE_PATH=/var/www/monitor #    TITLE_TEXT='CPU TEMP' UNDER_TEXT='TEMP' TEMP_MIN=20 TEMP_MAX=90 if ! [ -f $DATABASE ] then $RRDTOOL create $DATABASE -s $PERIOD DS:temperature:GAUGE:600:10:80 \ RRA:AVERAGE:0.5:1:576 \ RRA:AVERAGE:0.5:6:672 \ RRA:AVERAGE:0.5:24:732 \ RRA:AVERAGE:0.5:144:1460 fi $RRDTOOL update $DATABASE N:$SENSOR function DRAW_GRAPHIC { NOW_HOUR=`date +%H` NOW_MIN=`date +%M` NOW_SEC=`date +%S` case $2 in day) TIME_TEXT="Last 24 hours" ;; week) TIME_TEXT="Last week" ;; month) TIME_TEXT="Last mounth" ;; year) TIME_TEXT="Last year" ;; esac $RRDTOOL graph $IMAGE_PATH/$1 \ -s -1$2 \ -e now \ -a PNG \ -v 'C' \ -t "$TITLE_TEXT [$HOSTNAME] - $TIME_TEXT" \ -l $TEMP_MIN \ -u $TEMP_MAX \ -r \ -E \ -i \ -R light \ --zoom 1.0 \ -w 600 \ -h 150 \ DEF:temperature=$DATABASE:temperature:AVERAGE \ LINE2:temperature#33cc33:"$UNDER_TEXT" \ GPRINT:temperature:MIN:'MIN\:%2.lf' \ GPRINT:temperature:MAX:'MAX\:%2.lf' \ GPRINT:temperature:AVERAGE:'AVG\:%4.1lf' \ GPRINT:temperature:LAST:'NOW\:%2.lf \n' \ COMMENT:"TIME \: $NOW_HOUR\:$NOW_MIN\:$NOW_SEC \n" } DRAW_GRAPHIC 'temp_d.png' 'day' DRAW_GRAPHIC 'temp_w.png' 'week' DRAW_GRAPHIC 'temp_m.png' 'month' DRAW_GRAPHIC 'temp_y.png' 'year' 


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ Crontab рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдорд┐рдирдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

*/1 * * * * root /home/sysbes/temp.sh > /dev/null 2>&1

рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рджреГрд╢реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 <html> <head> <meta charset='koi8-r'> <title> RRD   :  -</title> </head> <body bgcolor='#ccddcc'> <h2> <font face='Arial'>   @  - </font> </h2> <img src='png/temp_d.png'> <br> <img src='png/temp_w.png'> <br> <img src='png/temp_m.png'> <br> <img src='png/temp_y.png'> </body> </html> 


рдирддреАрдЬрддрди, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 <html> <head> <meta charset='koi8-r'> <title>kd-ast</title> </head> <body bgcolor='#8FBC8F'> <br> <center> <h2><font face='Arial'>Real Time Load kd-ast:</font></h2> <center> <img src='cpu0.png'> </center><br> <center> </h2> <img src='network0.png'> </center><br> <center> </h2> <img src='memory.png'> </center><br> <center> <h2><font face='Arial'>CPU TEMP kd-ast:</font></h2> <img src='temp_d.png'> <br> <img src='temp_w.png'> <br> <img src='temp_m.png'> <br> <img src='temp_y.png'> </body> </html> 


рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдкрд░ _/monitor _/monitor рдПрдХ рдмреНрд░рд╛рдЙрдЬрд░ рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In186942/


All Articles