Hello,
Some Pieces of code, i use in C projet, they may can help you :
_Creation :_
somewhere in a header :
_somewhere.h_ :
#include [...]
#include <inttypes.h> // this portable representation doesn't depend of
architecture
#define MAX_LEN_RRD_ENTREE 128 // it's can be more or less, depend of
number of DS in your rra
#define DSIFOUTO "DS:ifouto:DERIVE:120:0:U"
#define DSIFINO "DS:ifino:DERIVE:120:0:U"
#define DSIFINERRO "DS:ifinerro:DERIVE:120:0:U"
#define DSIFINDISCO "DS:ifindisco:DERIVE:120:0:U"
#define DSIFINUNKO "DS:ifinunko:DERIVE:120:0:U"
#define DSIFOUTERRO "DS:ifouterro:DERIVE:120:0:U"
#define DSIFOUTDISCO "DS:ifoutdisco:DERIVE:120:0:U"
#define RRA_SERIE1 "RRA:AVERAGE:0.5:1:21600"
#define RRA_SERIE2 "RRA:AVERAGE:0.5:60:17856"
#define RRA_SERIE3 "RRA:AVERAGE:0.5:1440:26784"
#define DS_SERIES
"ifouto:ifino:ifinerro:ifindisco:ifinunko:ifouterro:ifoutdisco"
/** prototypes **/
[...]
somewhere in a source file :
_somewhere.c :_
#include "path/to/somewhere.h"
char *base_name_rrd = "pathtomyfile.rra";
const char *argv[10] = { DSIFOUTO,
DSIFINO,DSIFINERRO,DSIFINDISCO,DSIFINUNKO,DSIFOUTERRO,DSIFOUTDISCO,
RRA_SERIE1,
RRA_SERIE2, RRA_SERIE3 };
// For more dynamic creation you can use sprintf function with pattern
like this : "RRA:%s:%f:%i:%i:%i"
// const char ** argv = (const char **) malloc(sizeof(char *) * (nb_rra+
nd_ds));
// and affect DS value from argv[0] to argv[(nb_rra+ nd_ds)-1]
rrd_clear_error();
int status = rrd_create_r(baserrd_name, step, timestamp_start, argv);
if (status != 0) {
fprintf(stderr,"Can't create base [%s] :
%s\n",base_name_rrd,rrd_get_error());
}
// if dynamic free argv after creation (and others dynamics allocate
string ):
// free(argv);
_update :_
somewhere in a source file :
_somewhere2.c :_
#include "path/to/somewhere.h"
char ligne[MAX_LEN_RRD_ENTREE];
const char ** argv = (const char **) malloc(sizeof(char *) * (nb_update));
int i = 0;
for(;i<nb_update;i++){
argv[i]=malloc(sizeof(char *)*MAX_LEN_RRD_ENTREE); // can be
optimised for using less memories ...
sprintf(argv[i],
"%li:%"PRIu64":%"PRIu64":%"PRIu32":%"PRIu32":%"PRIu32":%"PRIu32":%"PRIu32,
// see somewhere.h
mydata[i].date_ts,
mydata[i].ifHCoutoctects,
mydata[i].ifHCinoctects,
mydata[i].inErr,
mydata[i].inDiscard,
mydata[i].inUnkProtos,
mydata[i].outErr,
mydata[i].outDiscard); //
mydata is struct with collected data, it depend of what you need to graph.
}
int status = rrd_update_r(base_rrd_name, DS_SERIES, 1, argv);
if (status != 0) {
fprintf("can't write update to base [%s]:
%s\n",base_rrd_name,rrd_get_error());
}
for(i=0;i<nb_update;i++){
free(argv[i]);
}
free(argv);
List of functions prototypes I use :
int rrd_create_r(const char *filename, unsigned long pdp_step, time_t
last_up, int argc, const char **argv);
rrd_info_t *rrd_info_r(char * filename);
int rrd_update_r(const char *filename,const char *_template,int
argc,const char **argv);
int rrd_fetch_r (const char *filename,const char *cf,time_t
*start,time_t *end,unsigned long *step,unsigned long *ds_cnt,char
***ds_namv,rrd_value_t **data);
int rrd_dump_r(const char *filename,char *outname);
time_t rrd_last_r (const char *filename);
int rrd_lastupdate_r (const char *filename,time_t
*ret_last_update,unsigned long *ret_ds_count,char ***ret_ds_names,char
***ret_last_ds);
time_t rrd_first_r(const char *filename,int rraindex);
rrd_info_t *rrd_graph_v(int argc, char **argv)
Dears,
Yannick
Le 02/12/2013 11:44, Fizza Hussain a écrit :
Hi,
The C API functions rrd_fetch ( ) and rrd_graph( ) both take 8
arguments, as per their declaration in the rrd.h file. This is how
they are declared in rrd.h file:
int rrd_fetch( int, char **,time_t *,time_t *,unsigned long *,unsigned
long *,char ***, rrd_value_t **);
int rrd_graph(int,char **,char ***,int *,int *,FILE *,double *,double *);
From what I know is that the first two arguments are the number of
arguments and the array of char* arguments respectively.
What are the rest of the arguments for? I mean what should I pass in
those arguments in order to use the function from a C code?
Thank you.
On Fri, Nov 29, 2013 at 12:28 PM, Fizza Hussain
<12mseefhuss...@seecs.edu.pk <mailto:12mseefhuss...@seecs.edu.pk>> wrote:
Thank you so much, Sir..
I has really helped me out.
On Fri, Nov 29, 2013 at 1:08 AM, Tony Mountifield
<t...@mountifield.org <mailto:t...@mountifield.org>> wrote:
In article
<CAOcjRXnATr1Qpu8rbjBT7_fsA4XaHANaCigTLe8qk6=cr1n...@mail.gmail.com
<mailto:cr1n...@mail.gmail.com>>,
Fizza Hussain <12mseefhuss...@seecs.edu.pk
<mailto:12mseefhuss...@seecs.edu.pk>> wrote:
> Hi!
>
> I have written a C program which use RRD C API functions
rrd_create(),
> rrd_update() and rrd_dump() to create, update and show the
contents of the
> RRD database. I want to fill the RRD database with the
integers returned by
> C rand( ) function i.e. the random value generated by the
rand( ) function
> is stored against each timestamp.
>
> Below is my code snippet:
>
> char *updateparams[] = {
> "rrdupdate",
> "Flow1bytes.rrd",
> "???:Bytecounter[i]",
> NULL
> };
>
>
> for (i=0; i < 50; i++)
> {
> flow1.bytes= rand();
> Bytecounter[i]=flow1.bytes;
> rrd_update(3,updateparams);
> }
>
> Please guide me how can I access the timestamp variable and
write it in the
> update parameter at the place marked by ???.
You need to have a buffer that you update. In your example above,
"???:Bytecounter[i]" is just a string, not a reference to the
Bytecounter
array. Try this:
char buffer[32];
char *updateparams[] = {
"rrdupdate",
"Flow1bytes.rrd",
buffer,
NULL
};
for (i=0; i<50; i++)
{
timestamp = ...; /* get a timestamp from somewhere */
flow1.bytes = rand();
Bytecounter[i] = flow1.bytes; /* why two steps, and
the storage in the array? */
snprintf(buffer, sizeof(buffer), "%d:%d", timestamp,
Bytecounter[i]);
rrd_update(3,updateparams);
}
I realize that this is just a test example, but you should be
aware that RRD
will not allow you to write multiple values to the same
timestamp (even if that
timestamp is N). For testing, you could initialise timestamp
outside the loop
and increment it within the loop.
Hope this is enough to get you started. It's really basic C
programming, not RRD-specific.
Cheers
Tony
--
Tony Mountifield
Work: t...@softins.co.uk <mailto:t...@softins.co.uk> -
http://www.softins.co.uk
Play: t...@mountifield.org <mailto:t...@mountifield.org> -
http://tony.mountifield.org
_______________________________________________
rrd-users mailing list
rrd-users@lists.oetiker.ch <mailto:rrd-users@lists.oetiker.ch>
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-users
_______________________________________________
rrd-users mailing list
rrd-users@lists.oetiker.ch
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-users
_______________________________________________
rrd-users mailing list
rrd-users@lists.oetiker.ch
https://lists.oetiker.ch/cgi-bin/listinfo/rrd-users